Функционал поиска
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 85 из 91.
Задание
ЛегкоДавайте улучшим нашу систему управления библиотекой, добавив функциональность поиска. Пользователям нужно легко находить книги, независимо от того, ищут ли они конкретное название, просматривают по автору или проверяют, что в данный момент доступно для выдачи.
Вы организуете свой код в четырех файлах:
Book.php— Ваш классBookсо свойствами только для чтения (isbn,title,author), приватным свойством$isAvailable, которое изначально равноtrue, и методами: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с стрелочными функциями иstriposдля поиска без учета регистра. Помните, чтоstriposвозвращаетfalse, когда совпадение не найдено, поэтому проверяйте на!== false.main.php— Подключите файл Library. Вы получите два входных значения: ключевое слово для поиска и имя автора.Создайте
Libraryи добавьте эти четыре книги:- ISBN:
"978-0", Title:"PHP Basics", Author:"John Smith" - ISBN:
"978-1", Title:"Advanced PHP", Author:"Jane Doe" - ISBN:
"978-2", Title:"Python Guide", Author:"John Smith" - ISBN:
"978-3", Title:"Web Development", Author:"Alice Brown"
Возьмите книгу с ISBN
"978-1", используяUserс ID1и именем"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: Создать пользователя с ID 1 и именем "TestUser", зарегистрировать его
// TODO: Взять книгу с ISBN "978-1"
// TODO: Выполнить поиск по названию, используя $searchKeyword, и вывести результаты
echo "Title matches:\n";
// Вывести название каждой найденной книги на новой строке
// TODO: Выполнить поиск по автору, используя $authorName, и вывести количество
echo "Author matches: " . /* количество здесь */ "\n";
// TODO: Получить доступные книги и вывести количество
echo "Available: " . /* количество здесь */ "\n";
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy