Menu
Coddy logo textTech

Podsumowanie — własna kolekcja

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 50 z 91.

challenge icon

Wyzwanie

Łatwy

Utwó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 lub null, 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ę od findBy (na przykład findByRole lub findByStatus), 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)

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

Poćwicz samodzielnie: Kompilator PHP online