مراجعة - Custom Collection
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 50 من 91.
التحدي
سهللنقم ببناء فئة 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
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)