Podsumowanie — własna kolekcja
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 50 z 91.
Wyzwanie
ŁatwyUtwórzmy klasę Collection, która łączy wszystkie metody magiczne poznane w tym rozdziale. Twoja kolekcja będzie działać jak elastyczny kontener danych, którego używanie jest naturalne: przechowywanie elementów pod kluczami, sprawdzanie, czy istnieją, dynamiczne wyszukiwanie elementów i tworzenie niezależnych kopii.
Rozmieścisz swój kod w dwóch plikach:
Collection.php: Utwórz klasęCollection, która przechowuje elementy w prywatnej tablicy. Twoja kolekcja powinna obsługiwać współpracujące ze sobą następujące metody magiczne:__construct(): Przyjmuje opcjonalną tablicę początkowych elementów (domyślnie pustą tablicę)__get($key): Zwraca element pod podanym kluczem lubnull, jeśli taki element nie istnieje__set($key, $value): Zapisuje wartość pod podanym kluczem__isset($key): Zwraca informację, czy klucz istnieje w kolekcji__unset($key): Usuwa element znajdujący się pod podanym kluczem__call($method, $args): Obsługuje dynamiczne metody wyszukujące. Gdy zostanie wywołana metoda zaczynająca się odfindBy(na przykładfindByRolelubfindByStatus), wyodrębnij nazwę pola (zamień na małe litery część następującą po "findBy"), przeszukaj wszystkie elementy i zwróć klucz pierwszego elementu, w którym to pole pasuje do pierwszego argumentu. Jeśli nie znajdziesz pasującego elementu, zwróćnull. W przypadku każdej innej metody zwróć"Unknown method: [method]"__toString(): Zwraca"Collection([count] items)", gdzie count oznacza liczbę elementów__clone(): Po sklonowaniu tablica elementów powinna być nową kopią (a nie odwołaniem do oryginału)
main.php: Dołącz plik Collection. Otrzymasz trzy dane wejściowe: nazwę klucza, wartość roli i wyszukiwaną rolę. Zbuduj kolekcję użytkowników i zademonstruj wszystkie metody magiczne:- Utwórz nową kolekcję
Collection - Dodaj użytkownika z kluczem z danych wejściowych, zapisując tablicę, w której
"name"ma wartość klucza, a"role"ma wartość roli z danych wejściowych - Dodaj kolejnego użytkownika z kluczem
"bob", zapisując["name" => "Bob", "role" => "editor"] - Wypisz informację, czy klucz z danych wejściowych istnieje, używając
isset(): wypisz"exists"lub"missing" - Wypisz wynik wywołania dynamicznej metody
findByRole()z wyszukiwaną rolą jako argumentem (powinna zwrócić klucz pasującego użytkownika albo nic, jeśli wynikiem jest null) - Wypisz kolekcję za pomocą
echo(wywołuje__toString) - Sklonuj kolekcję, a następnie usuń z klonu klucz z danych wejściowych
- Wypisz informację, czy klucz z danych wejściowych istnieje w oryginalnej kolekcji: wypisz
"exists"lub"missing"(powinien nadal istnieć, ponieważ klon jest niezależny)
- Utwórz nową kolekcję
Każdy wynik powinien znaleźć się w osobnym wierszu. Dynamiczna metoda wyszukująca zakłada, że każdy element kolekcji jest tablicą asocjacyjną z polami takimi jak "name" i "role".
Spróbuj swoich sił
<?php
require_once 'Collection.php';
// Odczytaj dane wejściowe
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));
// TODO: Utwórz nową instancję Collection
// TODO: Dodaj użytkownika z kluczem podanym na wejściu, zapisując tablicę z "name" => klucz i "role" => roleValue
// TODO: Dodaj kolejnego użytkownika z kluczem "bob", zapisując ["name" => "Bob", "role" => "editor"]
// TODO: Wypisz za pomocą isset(), czy klucz podany na wejściu istnieje — wynik to "exists" lub "missing"
// TODO: Wypisz wynik wywołania findByRole() z searchRole jako argumentem
// TODO: Wypisz kolekcję za pomocą echo (wywołuje __toString)
// TODO: Sklonuj kolekcję, a następnie usuń z klonu klucz podany na wejściu
// TODO: Wypisz, czy klucz podany na wejściu istnieje w ORYGINALNEJ kolekcji — "exists" lub "missing"
?>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