Interfejs administratora
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 86 z 91.
Wyzwanie
ŁatwyRozszerzmy nasz system zarządzania biblioteką, dodając funkcje administracyjne. Utworzysz klasę Admin, która dziedziczy po klasie User, ale ma specjalne uprawnienia do zarządzania księgozbiorem: dodawania nowych książek i usuwania istniejących.
Rozmieścisz swój kod w pięciu plikach:
Book.php: Twoja klasaBookz właściwościami tylko do odczytu (isbn,title,author), prywatną właściwością$isAvailable, której początkową wartością jesttrue, oraz metodami:isAvailable(),markAsBorrowed()imarkAsReturned().User.php: Dołącz plik Book. Twoja klasaUserz właściwościami tylko do odczytu (id,name), prywatną tablicą$borrowedBooks, stałąMAX_BOOKSo wartości3oraz metodami:getBorrowedBooks(),canBorrow(),addBook(Book $book)iremoveBook(string $isbn).Library.php: Dołącz plik User. Twoja klasaLibraryz dotychczasowymi funkcjami, w tymaddBook(),findBook(),borrowBook(),returnBook()oraz metodami wyszukiwania. Dodaj nową metodę:removeBook(string $isbn): void: usuwa książkę z kolekcji za pomocąunset()
Admin.php: Dołącz plik Library. Utwórz klasęAdmin, która rozszerza klasęUser. Administratorzy dziedziczą wszystkie możliwości użytkowników, a dodatkowo mają dwie metody administracyjne:addBookToLibrary(Library $library, Book $book): string: dodaje książkę do biblioteki i zwraca"Added: [title]"removeBookFromLibrary(Library $library, string $isbn): string: próbuje usunąć książkę, wykonując następujące sprawdzenia:- Jeśli książka nie istnieje, zwróć
"Book not found" - Jeśli książka jest aktualnie wypożyczona, zwróć
"Cannot remove: book is currently borrowed" - W przeciwnym razie usuń ją i zwróć
"Removed: [title]"
- Jeśli książka nie istnieje, zwróć
main.php: Dołącz plik Admin. Otrzymasz dwa dane wejściowe: ISBN i tytuł książki.Utwórz obiekt
Libraryoraz obiektAdmino identyfikatorze1i nazwie"AdminUser". Utwórz również zwykłego użytkownikaUsero identyfikatorze2i nazwie"RegularUser".Utwórz obiekt
Bookz podanym ISBN-em, tytułem i autorem"Test Author". Wykonaj poniższe operacje i wypisz wynik każdej z nich w nowej linii:- Poleć administratorowi dodać książkę do biblioteki
- Poleć zwykłemu użytkownikowi wypożyczyć książkę
- Poleć administratorowi spróbować usunąć książkę (powinno się nie udać: książka jest wypożyczona)
- Poleć zwykłemu użytkownikowi zwrócić książkę
- Poleć administratorowi usunąć książkę (tym razem powinno się udać)
- Poleć administratorowi ponownie spróbować usunąć tę samą książkę (powinno się nie udać: książka nie została znaleziona)
To wyzwanie pokazuje, jak dziedziczenie tworzy naturalną hierarchię: administratorzy to użytkownicy z dodatkowymi uprawnieniami. Kontrole bezpieczeństwa w metodzie removeBookFromLibrary zapewniają integralność danych, zapobiegając usuwaniu książek, które są nadal w obiegu.
Spróbuj swoich sił
<?php
require_once 'Admin.php';
// Wczytaj dane wejściowe
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Utwórz obiekt Library
// TODO: Utwórz obiekt Admin o ID 1 i nazwie "AdminUser"
// TODO: Utwórz obiekt User o ID 2 i nazwie "RegularUser"
// TODO: Utwórz obiekt Book z podanym ISBN, tytułem i autorem "Test Author"
// TODO: Wykonaj poniższe operacje i wypisz każdy wynik w nowym wierszu:
// 1. Niech administrator doda książkę do biblioteki
// 2. Niech zwykły użytkownik wypożyczy książkę
// 3. Niech administrator spróbuje usunąć książkę (operacja powinna się nie powieść — książka jest wypożyczona)
// 4. Niech zwykły użytkownik zwróci książkę
// 5. Niech administrator usunie książkę (teraz operacja powinna się powieść)
// 6. Niech administrator ponownie spróbuje usunąć tę samą książkę (operacja powinna się nie powieść — nie znaleziono książki)
?>Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online