Menu
Coddy logo textTech

Zusammenfassung - Eigene Collection

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

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Collection-Klasse erstellen, die alle magischen Methoden vereint, die Sie in diesem Kapitel gelernt haben. Ihre Sammlung wird als flexibler Datencontainer fungieren, der sich natürlich anfühlt — sie speichert Elemente nach Schlüsseln, prüft deren Existenz, findet Elemente dynamisch und erstellt unabhängige Kopien.

Sie werden Ihren Code in zwei Dateien organisieren:

  • Collection.php — Erstellen Sie eine Collection-Klasse, die Elemente in einem privaten Array speichert. Ihre Sammlung sollte das Zusammenspiel dieser magischen Methoden unterstützen:
    • __construct() — Akzeptiert ein optionales Array mit Anfangselementen (Standard ist ein leeres Array)
    • __get($key) — Gibt das Element am angegebenen Schlüssel zurück oder null, falls es nicht existiert
    • __set($key, $value) — Speichert den Wert unter dem angegebenen Schlüssel
    • __isset($key) — Gibt zurück, ob der Schlüssel in der Sammlung existiert
    • __unset($key) — Entfernt das Element am angegebenen Schlüssel
    • __call($method, $args) — Behandelt dynamische Finder-Methoden. Wenn eine Methode aufgerufen wird, die mit findBy beginnt (wie findByRole oder findByStatus), extrahieren Sie den Feldnamen (wandeln Sie den Teil nach "findBy" in Kleinbuchstaben um), durchsuchen Sie alle Elemente und geben Sie den Schlüssel des ersten Elements zurück, bei dem dieses Feld mit dem ersten Argument übereinstimmt. Geben Sie null zurück, wenn keine Übereinstimmung gefunden wird. Für jede andere Methode geben Sie "Unknown method: [method]" zurück
    • __toString() — Gibt "Collection([count] items)" zurück, wobei count die Anzahl der Elemente ist
    • __clone() — Beim Klonen sollte das items-Array eine frische Kopie sein (keine Referenz auf das Original)
  • main.php — Binden Sie die Collection-Datei ein. Sie erhalten drei Eingaben: einen Schlüsselnamen, einen Rollenwert und eine Suchrolle. Erstellen Sie eine Sammlung von Benutzern und demonstrieren Sie alle magischen Methoden:
    • Erstellen Sie eine neue Collection
    • Fügen Sie einen Benutzer mit dem Eingabeschlüssel hinzu und speichern Sie ein Array, bei dem "name" auf den Schlüssel und "role" auf den eingegebenen Rollenwert gesetzt ist
    • Fügen Sie einen weiteren Benutzer mit dem Schlüssel "bob" hinzu und speichern Sie ["name" => "Bob", "role" => "editor"]
    • Geben Sie aus, ob der Eingabeschlüssel existiert, indem Sie isset() verwenden — Ausgabe "exists" oder "missing"
    • Geben Sie das Ergebnis des Aufrufs der dynamischen Methode findByRole() mit der Suchrolle als Argument aus (dies sollte den Schlüssel des passenden Benutzers zurückgeben, oder nichts, wenn null)
    • Geben Sie die Sammlung mit echo aus (löst __toString aus)
    • Klonen Sie die Sammlung und entfernen Sie dann den Eingabeschlüssel aus dem Klon
    • Geben Sie aus, ob der Eingabeschlüssel in der ursprünglichen Sammlung existiert — Ausgabe "exists" oder "missing" (sollte noch existieren, da der Klon unabhängig ist)

Jede Ausgabe sollte in einer eigenen Zeile stehen. Der dynamische Finder geht davon aus, dass jedes Element in Ihrer Sammlung 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 eingegebenen Schlüssel hinzu, speichere ein Array mit "name" => key und "role" => roleValue

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

// TODO: Gib aus, ob der eingegebene Schlüssel existiert, unter Verwendung von isset() - 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 und lösche dann den eingegebenen Schlüssel aus dem Klon mit unset

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

?>

Alle Lektionen in Objektorientierte Programmierung