Классы Book и User
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 83 из 91.
Задание
ЛегкоДавайте заложим основу нашей системы управления библиотекой, создав классы Book и User. Эти основные объекты предметной области будут работать вместе для управления библиотечными операциями.
Вы распределите свой код по трем файлам:
Book.php— Создайте классBook, который отслеживает библиотечные книги. Ваша книга должна иметь три свойства только для чтения (readonly), заданные через продвижение параметров конструктора (constructor promotion):isbn,titleиauthor. Включите приватное свойство$isAvailable, которое изначально равноtrue. Добавьте три метода:isAvailable(): bool— возвращает статус доступностиmarkAsBorrowed(): void— устанавливает доступность в falsemarkAsReturned(): void— устанавливает доступность в true
User.php— Подключите файл Book и создайте классUser, представляющий членов библиотеки. Ваш пользователь должен иметь два свойства только для чтения через продвижение конструктора:id(int) иname(string). Включите приватный массив$borrowedBooks(изначально пустой) и константуMAX_BOOKS, равную3. Добавьте следующие методы:getBorrowedBooks(): array— возвращает массив взятых книгcanBorrow(): bool— возвращает true, если у пользователя меньшеMAX_BOOKSвзятых книгaddBook(Book $book): void— добавляет книгу в массив взятыхremoveBook(string $isbn): void— удаляет книгу по ISBN, используяarray_filter
main.php— Подключите файл User и оживите ваши классы. Вы получите четыре входных значения: ID пользователя, имя пользователя, ISBN книги и название книги (автором будет"Unknown").Создайте объекты
UserиBookс предоставленными значениями. Выведите, может ли пользователь изначально брать книги, затем сделайте так, чтобы пользователь взял книгу (отметьте её как выданную и добавьте пользователю). Наконец, выведите доступность книги и количество взятых книг.Формат вывода:
Can borrow: [yes/no] Book available: [yes/no] Books borrowed: [count]
Обратите внимание, как инкапсуляция защищает внутреннее состояние — доступность книги меняется только через специальные методы, а взятые пользователем книги управляются через контролируемый доступ. Этот фундамент поддержит систему заимствования, которую мы построим далее.
Попробуйте сами
<?php
require_once 'User.php';
// Чтение входных данных
$userId = intval(trim(fgets(STDIN)));
$userName = trim(fgets(STDIN));
$bookIsbn = trim(fgets(STDIN));
$bookTitle = trim(fgets(STDIN));
$bookAuthor = "Unknown";
// TODO: Создать объект User с предоставленным id и именем
// TODO: Создать объект Book с предоставленным isbn, названием и автором
// TODO: Вывести, может ли пользователь изначально брать книги
// Формат: "Can borrow: yes" или "Can borrow: no"
// TODO: Пусть пользователь возьмет книгу:
// - Отметить книгу как выданную
// - Добавить книгу в список взятых книг пользователя
// TODO: Вывести доступность книги
// Формат: "Book available: yes" или "Book available: no"
// TODO: Вывести количество взятых книг
// Формат: "Books borrowed: [count]"
?>Все уроки раздела Объектно-ориентированное программирование
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