Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

واجهة المسؤول

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 86 من 91.

challenge icon

التحدي

سهل

لنوسّع نظام إدارة Library بإضافة capabilities إدارية. ستنشئ فئة Admin ترث من User، ولكنها تمتلك صلاحيات خاصة لإدارة مخزون المكتبة: إضافة كتب جديدة وإزالة الكتب الموجودة.

ستنظّم شيفرتك عبر خمسة ملفات:

  • Book.php: فئة Book الخاصة بك، مع خصائص readonly (isbn وtitle وauthor)، وخصيصة $isAvailable خاصة تبدأ بالقيمة true، والطرائق: isAvailable() وmarkAsBorrowed() وmarkAsReturned().
  • User.php: ضمّن ملف Book. فئة User الخاصة بك، مع خصائص readonly (id وname)، وarray خاصة باسم $borrowedBooks، وثابت MAX_BOOKS قيمته 3، والطرائق: getBorrowedBooks() وcanBorrow() وaddBook(Book $book) وremoveBook(string $isbn).
  • Library.php: ضمّن ملف User. فئة Library الخاصة بك مع الوظائف الحالية، بما في ذلك addBook() وfindBook() وborrowBook() وreturnBook() وطرائق البحث. أضف طريقة جديدة:
    • removeBook(string $isbn): void: تزيل كتابًا من collection باستخدام unset()
  • Admin.php: ضمّن ملف Library. أنشئ فئة Admin تمتد من User. يرث Admin جميع capabilities الخاصة بالمستخدم، ولكنه يكتسب طريقتين إداريتين:
    • addBookToLibrary(Library $library, Book $book): string: تضيف الكتاب إلى المكتبة وتُرجع "Added: [title]"
    • removeBookFromLibrary(Library $library, string $isbn): string: تحاول إزالة كتاب مع إجراء عمليات التحقق التالية:
      • إذا كان الكتاب لا exist، فأرجِع "Book not found"
      • إذا كان الكتاب borrowed حاليًا، فأرجِع "Cannot remove: book is currently borrowed"
      • بخلاف ذلك، أزِله وأرجِع "Removed: [title]"
  • main.php: ضمّن ملف Admin. ستتلقى مدخلين: ISBN وعنوان كتاب.

    أنشئ Library وAdmin بالمعرّف 1 والاسم "AdminUser". وأنشئ أيضًا User عاديًا بالمعرّف 2 والاسم "RegularUser".

    أنشئ Book باستخدام ISBN والعنوان المُقدَّمين، والمؤلف "Test Author". نفّذ العمليات التالية واطبع كل نتيجة في سطر جديد:

    1. Have يقوم admin بإضافة الكتاب إلى المكتبة
    2. Have يقوم المستخدم العادي باستعارة الكتاب
    3. Have يحاول admin إزالة الكتاب (ينبغي أن fail: فهو borrowed)
    4. Have يعيد المستخدم العادي الكتاب
    5. Have يزيل admin الكتاب (ينبغي أن ينجح الآن)
    6. Have يحاول admin إزالة الكتاب نفسه مرة أخرى (ينبغي أن يفشل، لأنه غير موجود)

يوضح هذا التحدي كيف ينشئ التوريث تسلسلًا هرميًا طبيعيًا: admins هم users مع امتيازات إضافية. تضمن عمليات التحقق من السلامة في removeBookFromLibrary سلامة البيانات من خلال منع إزالة الكتب التي لا تزال متداولة.

جرّب بنفسك

<?php
require_once 'Admin.php';

// اقرأ الإدخال
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));

// TODO: أنشئ Library

// TODO: أنشئ Admin بالمعرّف 1 والاسم "AdminUser"

// TODO: أنشئ User عادي بالمعرّف 2 والاسم "RegularUser"

// TODO: أنشئ Book باستخدام الـ ISBN والعنوان المقدمين والمؤلف "Test Author"

// TODO: نفّذ هذه العمليات واطبع كل نتيجة في سطر جديد:
// 1. اجعل الـ admin يضيف الـ book إلى الـ library
// 2. اجعل الـ user العادي يستعير الـ book
// 3. اجعل الـ admin يحاول إزالة الـ book (يجب أن يفشل - إنه مستعار)
// 4. اجعل الـ user العادي يعيد الـ book
// 5. اجعل الـ admin يزيل الـ book (يجب أن ينجح الآن)
// 6. اجعل الـ admin يحاول إزالة نفس الـ book مرة أخرى (يجب أن يفشل - غير موجود)

?>

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت