Классы книг и пользователей
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 83 из 91.
Задание
ЛегкоДавайте создадим основу нашей системы управления библиотекой, создав классы Book и User. Эти основные объекты предметной области будут работать вместе для управления операциями библиотеки.
Вы организуете код в трёх файлах:
Book.php: создайте классBook, который отслеживает книги библиотеки. У вашей книги должны быть три свойства readonly, заданные с помощью продвижения параметров конструктора:isbn,titleиauthor. Добавьте приватное свойство$isAvailable, начальное значение которого —true. Добавьте три метода:isAvailable(): bool: возвращает статус доступностиmarkAsBorrowed(): void: устанавливает доступность в значение falsemarkAsReturned(): void: устанавливает доступность в значение true
User.php: подключите файл Book и создайте классUser, представляющий читателей библиотеки. У вашего пользователя должны быть два свойства readonly, заданные с помощью продвижения параметров конструктора:id(int) иname(string). Добавьте приватный массив$borrowedBooks(изначально пустой) и константуMAX_BOOKSсо значением3. Добавьте следующие методы:getBorrowedBooks(): array: возвращает массив взятых книгcanBorrow(): bool: возвращает true, если пользователь взял меньше книг, чем MAX_BOOKSaddBook(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 и name
// TODO: Создать объект Book с предоставленными isbn, title и author
// TODO: Вывести, может ли пользователь взять книгу изначально
// Format: "Can borrow: yes" or "Can borrow: no"
// TODO: Пусть пользователь возьмёт книгу:
// - Отметить книгу как взятую
// - Добавить книгу к взятым книгам пользователя
// TODO: Вывести доступность книги
// Format: "Book available: yes" or "Book available: no"
// TODO: Вывести количество взятых книг
// Format: "Books borrowed: [count]"
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция11Система типов и обработка ошибок
Объявления типовNullable-типыОбъединение и пересечение типовКлассы исключенийПользовательская иерархия исключенийTry, Catch, FinallyПовторение — валидатор формы14Проект: управление библиотекой
Обзор проектаКлассы книг и пользователей3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP