Интерфейс администратора
Часть раздела Объектно-ориентированное программирование путешествия по 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Потренируйтесь самостоятельно: Онлайн-компилятор PHP