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

مراجعة - Custom Collection

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

challenge icon

التحدي

سهل

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

ستنظم التعليمات البرمجية عبر ملفين:

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

يجب أن يكون كل ناتج في سطر مستقل. يفترض الباحث الديناميكي أن كل عنصر في مجموعتك هو مصفوفة ترابطية تحتوي على حقول مثل "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: استنسخ المجموعة، ثم unset المفتاح المدخل من النسخة

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

?>

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

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