Rückblick – Benutzerdefinierte Sammlung
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 50 von 91.
Aufgabe
EinfachLass 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 eineCollection-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 odernull, 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 mitfindBybeginnt (wiefindByRoleoderfindByStatus), 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. Gibnullzurü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
echoaus (löst__toStringaus) - 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)
- Erstelle eine neue
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
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler