Интерфейс администратора
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 86 из 91.
Задание
ЛегкоДавайте расширим нашу систему управления библиотекой, добавив административные возможности. Вы создадите класс Admin, который наследуется от User, но обладает специальными полномочиями для управления инвентарем библиотеки — добавлением новых книг и удалением существующих.
Вы организуете свой код в пяти файлах:
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с существующим функционалом, включаяaddBook(),findBook(),borrowBook(),returnBook()и методы поиска. Добавьте новый метод:removeBook(string $isbn): void— удаляет книгу из коллекции с помощьюunset()
Admin.php— Подключите файл Library. Создайте классAdmin, который расширяетUser. Администраторы наследуют все возможности пользователей, но получают два административных метода:addBookToLibrary(Library $library, Book $book): string— добавляет книгу в библиотеку и возвращает"Added: [title]"removeBookFromLibrary(Library $library, string $isbn): string— пытается удалить книгу со следующими проверками:- Если книга не найдена, вернуть
"Book not found" - Если книга в данный момент выдана, вернуть
"Cannot remove: book is currently borrowed" - В противном случае удалить её и вернуть
"Removed: [title]"
- Если книга не найдена, вернуть
main.php— Подключите файл Admin. Вы получите два входных значения: ISBN и название книги.Создайте
LibraryиAdminс ID1и именем"AdminUser". Также создайте обычногоUserс ID2и именем"RegularUser".Создайте
Bookс предоставленным ISBN, названием и автором"Test Author". Выполните следующие операции и выведите каждый результат на новой строке:- Пусть администратор добавит книгу в библиотеку
- Пусть обычный пользователь возьмет книгу
- Пусть администратор попытается удалить книгу (должно не получиться — она выдана)
- Пусть обычный пользователь вернет книгу
- Пусть администратор удалит книгу (теперь должно получиться)
- Пусть администратор попытается удалить ту же книгу еще раз (должно не получиться — не найдена)
Эта задача демонстрирует, как наследование создает естественную иерархию — администраторы являются пользователями с дополнительными привилегиями. Проверки безопасности в removeBookFromLibrary обеспечивают целостность данных, предотвращая удаление книг, которые все еще находятся в обращении.
Попробуйте сами
<?php
require_once 'Admin.php';
// Чтение входных данных
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Создать библиотеку (Library)
// TODO: Создать администратора (Admin) с ID 1 и именем "AdminUser"
// TODO: Создать обычного пользователя (User) с ID 2 и именем "RegularUser"
// TODO: Создать книгу (Book) с предоставленным ISBN, названием и автором "Test Author"
// TODO: Выполнить эти операции и вывести каждый результат на новой строке:
// 1. Пусть администратор добавит книгу в библиотеку
// 2. Пусть обычный пользователь возьмет книгу
// 3. Пусть администратор попытается удалить книгу (должно не удаться — она выдана)
// 4. Пусть обычный пользователь вернет книгу
// 5. Пусть администратор удалит книгу (теперь должно удаться)
// 6. Пусть администратор попытается удалить ту же книгу снова (должно не удаться — не найдена)
?>Все уроки раздела Объектно-ориентированное программирование
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