خاصية البحث
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 85 من 91.
التحدي
سهلدعونا نقوم بتحسين نظام إدارة المكتبة الخاص بنا عن طريق إضافة وظيفة البحث. يحتاج المستخدمون إلى العثور على الكتب بسهولة، سواء كانوا يبحثون عن عنوان محدد، أو يتصفحون حسب المؤلف، أو يتحققون مما هو متاح حالياً للاستعارة.
ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:
Book.php— فئةBookالخاصة بك مع خصائص للقراءة فقط (isbn،title،author)، وخاصية خاصة$isAvailableتبدأ بـtrue، والأساليب (methods):isAvailable()،markAsBorrowed()، وmarkAsReturned().User.php— قم بتضمين ملف Book. فئةUserالخاصة بك مع خصائص للقراءة فقط (id،name)، ومصفوفة خاصة$borrowedBooks، وثابتMAX_BOOKSبقيمة3، والأساليب:getBorrowedBooks()،canBorrow()،addBook(Book $book)، وremoveBook(string $isbn).Library.php— قم بتضمين ملف User. قم بتوسيع فئةLibraryالخاصة بك بالوظائف الحالية بالإضافة إلى ثلاثة أساليب بحث جديدة:searchByTitle(string $keyword): array— تعيد جميع الكتب التي يحتوي عنوانها على الكلمة المفتاحية (غير حساس لحالة الأحرف)searchByAuthor(string $author): array— تعيد جميع الكتب التي يحتوي اسم المؤلف فيها على مصطلح البحث (غير حساس لحالة الأحرف)getAvailableBooks(): array— تعيد فقط الكتب المتاحة حالياً للاستعارة
استخدم
array_filterمع الدوال السهمية (arrow functions) وstriposللمطابقة غير الحساسة لحالة الأحرف. تذكر أنstriposتعيدfalseعندما لا يتم العثور على مطابقة، لذا تحقق باستخدام!== false.main.php— قم بتضمين ملف Library. ستتلقى مدخلين: كلمة مفتاحية للبحث واسم مؤلف.قم بإنشاء
Libraryوأضف هذه الكتب الأربعة:- ISBN:
"978-0"، العنوان:"PHP Basics"، المؤلف:"John Smith" - ISBN:
"978-1"، العنوان:"Advanced PHP"، المؤلف:"Jane Doe" - ISBN:
"978-2"، العنوان:"Python Guide"، المؤلف:"John Smith" - ISBN:
"978-3"، العنوان:"Web Development"، المؤلف:"Alice Brown"
قم باستعارة الكتاب ذو الرقم الدولي المعياري
"978-1"باستخدامUserبمعرف1واسم"TestUser".ثم قم بإجراء عمليات البحث هذه واطبع النتائج:
- البحث حسب العنوان باستخدام المدخل الأول، واطبع عنوان كل كتاب مطابق في سطر جديد
- البحث حسب المؤلف باستخدام المدخل الثاني، واطبع عدد الكتب المطابقة
- احصل على الكتب المتاحة واطبع عددها
تنسيق المخرجات:
Title matches: [title1] [title2] ... Author matches: [count] Available: [count]- ISBN:
يوضح هذا التحدي كيف أن array_filter المدمجة مع stripos تنشئ وظيفة بحث قوية وسهلة الاستخدام. تعني المطابقة غير الحساسة لحالة الأحرف أن المستخدمين لا يحتاجون للقلق بشأن حالة الأحرف الكبيرة والصغيرة عند البحث.
جرّب بنفسك
<?php
require_once 'Library.php';
// قراءة المدخلات
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));
// TODO: إنشاء نسخة من المكتبة (Library)
// TODO: إضافة الكتب الأربعة إلى المكتبة:
// ISBN: "978-0", العنوان: "PHP Basics", المؤلف: "John Smith"
// ISBN: "978-1", العنوان: "Advanced PHP", المؤلف: "Jane Doe"
// ISBN: "978-2", العنوان: "Python Guide", المؤلف: "John Smith"
// ISBN: "978-3", العنوان: "Web Development", المؤلف: "Alice Brown"
// TODO: إنشاء مستخدم بمعرف 1 واسم "TestUser"، وقم بتسجيله
// TODO: استعارة الكتاب ذو الرقم الدولي المعياري (ISBN) "978-1"
// TODO: البحث حسب العنوان باستخدام $searchKeyword وطباعة النتائج
echo "Title matches:\n";
// طباعة عنوان كل كتاب مطابق في سطر جديد
// TODO: البحث حسب المؤلف باستخدام $authorName وطباعة العدد
echo "Author matches: " . /* العدد هنا */ "\n";
// TODO: الحصول على الكتب المتاحة وطباعة العدد
echo "Available: " . /* العدد هنا */ "\n";
?>جميع دروس 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 Collection11نظام الأنواع ومعالجة الأخطاء
تصريحات الأنواعالأنواع القابلة للقيمة Nullأنواع الاتحاد والتقاطعفئات الاستثناءاتتسلسل الاستثناءات المخصصةTry, Catch, Finallyمراجعة - مدقق النماذج14مشروع: إدارة المكتبة
نظرة عامة على المشروعفئات الكتاب والمستخدم3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)