مراجعة - Custom Collection
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 50 من 91.
التحدي
سهللننشئ فئة 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"
?>جميع دروس البرمجة كائنية التوجه
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)تدرّب بنفسك: مترجم PHP عبر الإنترنت