Menu
Coddy logo textTech

Rückblick – Benutzerdefinierte Sammlung

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 50 von 91.

challenge icon

Aufgabe

Einfach

Lass uns eine Collection-Klasse erstellen, die alle magischen Methoden zusammenführt, die du in diesem Kapitel kennengelernt hast. Deine Collection dient als flexibler Datencontainer, der sich natürlich verwenden lässt: Elemente nach Schlüssel speichern, prüfen, ob sie vorhanden sind, Elemente dynamisch finden und unabhängige Kopien erstellen.

Du organisierst deinen Code über zwei Dateien:

  • Collection.php: Erstelle eine Collection-Klasse, die Elemente in einem privaten Array speichert. Deine Collection sollte die folgenden magischen Methoden gemeinsam unterstützen:
    • __construct(): Akzeptiert ein optionales Array mit anfänglichen Elementen (standardmäßig ein leeres Array)
    • __get($key): Gibt das Element am angegebenen Schlüssel zurück oder null, wenn es nicht vorhanden ist
    • __set($key, $value): Speichert den Wert unter dem angegebenen Schlüssel
    • __isset($key): Gibt zurück, ob der Schlüssel in der Collection vorhanden ist
    • __unset($key): Entfernt das Element am angegebenen Schlüssel
    • __call($method, $args): Verarbeitet dynamische Suchmethoden. Wenn eine Methode aufgerufen wird, die mit findBy beginnt (wie findByRole oder findByStatus), extrahiere den Feldnamen (wandle den Teil nach "findBy" in Kleinbuchstaben um), durchsuche alle Elemente und gib den Schlüssel des ersten Elements zurück, bei dem dieses Feld mit dem ersten Argument übereinstimmt. Gib null zurück, wenn keine Übereinstimmung gefunden wird. Gib für jede andere Methode "Unknown method: [method]" zurück
    • __toString(): Gibt "Collection([count] items)" zurück, wobei count die Anzahl der Elemente ist
    • __clone(): Beim Klonen sollte das Array mit den Elementen eine neue Kopie sein (keine Referenz auf das Original)
  • main.php: Binde die Collection-Datei ein. Du erhältst drei Eingaben: einen Schlüsselnamen, einen Rollenwert und eine zu suchende Rolle. Erstelle eine Collection mit Benutzern und demonstriere alle magischen Methoden:
    • Erstelle eine neue Collection
    • Füge einen Benutzer mit dem Eingabeschlüssel hinzu und speichere ein Array, in dem "name" auf den Schlüssel und "role" auf den Eingabewert für die Rolle gesetzt ist
    • Füge einen weiteren Benutzer mit dem Schlüssel "bob" hinzu und speichere ["name" => "Bob", "role" => "editor"]
    • Gib mithilfe von isset() aus, ob der Eingabeschlüssel vorhanden ist: Ausgabe "exists" oder "missing"
    • Gib das Ergebnis des Aufrufs der dynamischen Methode findByRole() mit der zu suchenden Rolle als Argument aus (dies sollte den Schlüssel des passenden Benutzers zurückgeben oder nichts, wenn das Ergebnis null ist)
    • Gib die Collection mit echo aus (löst __toString aus)
    • Klon die Collection und entferne anschließend den Eingabeschlüssel aus dem Klon
    • Gib aus, ob der Eingabeschlüssel in der ursprünglichen Collection vorhanden ist: Ausgabe "exists" oder "missing" (er sollte weiterhin vorhanden sein, da der Klon unabhängig ist)

Jede Ausgabe sollte in einer eigenen Zeile stehen. Die dynamische Suche setzt voraus, dass jedes Element in deiner Collection ein assoziatives Array mit Feldern wie "name" und "role" ist.

Probier es selbst

<?php

require_once 'Collection.php';

// Eingaben lesen
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: Erstelle eine neue Collection

// TODO: Füge einen Benutzer mit dem Eingabe-Schlüssel hinzu und speichere ein Array mit "name" => key und "role" => roleValue

// TODO: Füge einen weiteren Benutzer mit Schlüssel "bob" hinzu und speichere ["name" => "Bob", "role" => "editor"]

// TODO: Gib aus, ob der Eingabe-Schlüssel mit isset() existiert - Ausgabe "exists" oder "missing"

// TODO: Gib das Ergebnis des Aufrufs von findByRole() mit searchRole als Argument aus

// TODO: Gib die Collection mit echo aus (löst __toString aus)

// TODO: Klone die Collection, dann unset den Eingabe-Schlüssel vom Klon

// TODO: Gib aus, ob der Eingabe-Schlüssel in der ORIGINALEN Collection existiert - "exists" oder "missing"

?>

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler