Система выдачи книг
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 84 из 91.
Задание
ЛегкоДавайте воплотим нашу систему управления библиотекой в жизнь, создав класс Library, который координирует все операции по выдаче книг. Этот центральный координатор будет управлять коллекцией книг и обеспечивать соблюдение правил, которые поддерживают бесперебойную работу нашей библиотеки.
Вы организуете свой код в четырех файлах:
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, который управляет коллекцией книг. Ваша библиотека должна иметь:- Приватный массив
$booksдля хранения книг, индексированных по ISBN addBook(Book $book): void— добавляет книгу в коллекциюfindBook(string $isbn): ?Book— возвращает книгу или null, если она не найденаborrowBook(User $user, string $isbn): string— проверяет и обрабатывает выдачу книги, возвращая соответствующие сообщенияreturnBook(User $user, string $isbn): string— обрабатывает возврат и обновляет состояние как книги, так и пользователя
Метод
borrowBookдолжен последовательно проверять три условия и возвращать именно эти сообщения:"Book not found"— если книга не существует"Book is not available"— если книга уже выдана"Borrowing limit reached"— если у пользователя уже 3 книги"Successfully borrowed: [title]"— при успешной выдаче
Метод
returnBookдолжен возвращать"Book not found", если книга не существует, или"Successfully returned: [title]"при успешном возврате.- Приватный массив
main.php— Подключите файл Library. Вы получите два входных значения: ISBN и название книги.Создайте
Library,Userс ID1и именем"Alice", иBookс предоставленным ISBN, названием и автором"Unknown". Добавьте книгу в библиотеку, затем выполните следующие операции и выведите каждый результат на новой строке:- Возьмите книгу в библиотеке
- Попробуйте взять ту же самую книгу еще раз
- Верните книгу
- Возьмите книгу еще раз
Эта задача демонстрирует, как класс Library централизует бизнес-логику — он проверяет условия, координирует изменения состояния объектов Book и User и возвращает содержательную обратную связь для каждой операции.
Попробуйте сами
<?php
require_once 'Library.php';
// Чтение входных данных
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Создать экземпляр Library
// TODO: Создать пользователя (User) с ID 1 и именем "Alice"
// TODO: Создать книгу (Book) с предоставленным ISBN, названием и автором "Unknown"
// TODO: Добавить книгу в библиотеку
// TODO: Выполнить эти операции и вывести каждый результат на новой строке:
// 1. Взять книгу
// 2. Попробовать взять ту же книгу снова
// 3. Вернуть книгу
// 4. Взять книгу еще раз
?>Все уроки раздела Объектно-ориентированное программирование
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