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

مراجعة - Custom Collection

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 50 من 91.

challenge icon

التحدي

سهل

لنقم ببناء فئة Collection تجمع كل الأساليب السحرية (magic methods) التي تعلمتها في هذا الفصل. ستعمل مجموعتك كحاوية بيانات مرنة تبدو طبيعية في الاستخدام — حيث تخزن العناصر بواسطة مفتاح، وتتحقق من وجودها، وتجد العناصر ديناميكيًا، وتنشئ نسخًا مستقلة.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Collection.php — أنشئ فئة Collection تخزن العناصر في مصفوفة خاصة (private array). يجب أن تدعم مجموعتك هذه الأساليب السحرية وهي تعمل معًا:
    • __construct() — يقبل مصفوفة اختيارية من العناصر الأولية (الافتراضي مصفوفة فارغة)
    • __get($key) — يعيد العنصر الموجود عند المفتاح المعطى، أو null إذا لم يكن موجودًا
    • __set($key, $value) — يخزن القيمة عند المفتاح المعطى
    • __isset($key) — يعيد ما إذا كان المفتاح موجودًا في المجموعة
    • __unset($key) — يزيل العنصر الموجود عند المفتاح المعطى
    • __call($method, $args) — يتعامل مع أساليب البحث الديناميكية. عند استدعاء أسلوب يبدأ بـ findBy (مثل findByRole أو findByStatus)، استخرج اسم الحقل (حول الجزء الذي يلي "findBy" إلى أحرف صغيرة)، وابحث في جميع العناصر، وأعد مفتاح أول عنصر يتطابق فيه ذلك الحقل مع الوسيط الأول. أعد null إذا لم يتم العثور على تطابق. لأي أسلوب آخر، أعد "Unknown method: [method]"
    • __toString() — يعيد "Collection([count] items)" حيث count هو عدد العناصر
    • __clone() — عند الاستنساخ، يجب أن تكون مصفوفة العناصر نسخة جديدة (ليست مرجعًا للأصل)
  • main.php — قم بتضمين ملف Collection. ستتلقى ثلاثة مدخلات: اسم مفتاح، وقيمة دور (role)، ودور للبحث عنه. قم ببناء مجموعة من المستخدمين واستعرض جميع الأساليب السحرية:
    • أنشئ Collection جديدة
    • أضف مستخدمًا بالمفتاح المدخل، مع تخزين مصفوفة تحتوي على "name" مضبوطًا على المفتاح و "role" مضبوطًا على قيمة الدور المدخلة
    • أضف مستخدمًا آخر بالمفتاح "bob"، مع تخزين ["name" => "Bob", "role" => "editor"]
    • اطبع ما إذا كان المفتاح المدخل موجودًا باستخدام isset() — المخرج "exists" أو "missing"
    • اطبع نتيجة استدعاء أسلوب findByRole() الديناميكي مع دور البحث كوسيط (يجب أن يعيد هذا مفتاح المستخدم المطابق، أو لا شيء إذا كان null)
    • اطبع المجموعة باستخدام echo (مما يؤدي إلى تشغيل __toString)
    • قم باستنساخ المجموعة، ثم قم بإلغاء تعيين (unset) المفتاح المدخل من النسخة المستنسخة
    • اطبع ما إذا كان المفتاح المدخل موجودًا في المجموعة الأصلية — المخرج "exists" أو "missing" (يجب أن يظل موجودًا لأن النسخة المستنسخة مستقلة)

يجب أن يكون كل مخرج في سطر خاص به. يفترض الباحث الديناميكي أن كل عنصر في مجموعتك هو مصفوفة ترابطية (associative array) تحتوي على حقول مثل "name" و "role".

جرّب بنفسك

<?php

require_once 'Collection.php';

// قراءة المدخلات
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: إنشاء مجموعة (Collection) جديدة

// TODO: إضافة مستخدم بالمفتاح المدخل، مع تخزين مصفوفة تحتوي على "name" => key و "role" => roleValue

// TODO: إضافة مستخدم آخر بالمفتاح "bob"، مع تخزين ["name" => "Bob", "role" => "editor"]

// TODO: طباعة ما إذا كان المفتاح المدخل موجوداً باستخدام isset() - المخرجات "exists" أو "missing"

// TODO: طباعة نتيجة استدعاء findByRole() مع تمرير searchRole كمعامل

// TODO: طباعة المجموعة باستخدام echo (يؤدي إلى استدعاء __toString)

// TODO: استنساخ المجموعة، ثم حذف المفتاح المدخل من النسخة المستنسخة

// TODO: طباعة ما إذا كان المفتاح المدخل موجوداً في المجموعة الأصلية - "exists" أو "missing"

?>

جميع دروس Object Oriented Programming