__get, __set, __isset, __unset
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 46 von 91.
PHP stellt vier magische Methoden bereit, die den Zugriff auf Eigenschaften abfangen: __get(), __set(), __isset() und __unset(). Sie werden ausgelöst, wenn du versuchst, auf Eigenschaften zuzugreifen, die nicht existieren oder nicht zugänglich sind.
Die __get()-__set() das Schreiben in eine solche verarbeitet. Dadurch kannst du dynamische Eigenschaften erstellen oder Logik hinzufügen, wenn auf Eigenschaften zugegriffen wird:
<?php
class DynamicObject {
private array $data = [];
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
}
$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;
Ausgabe:
Hello - 42Die Methode __isset() wird durch isset() oder empty() ausgelöst, und __unset() reagiert auf die Funktion unset():
<?php
class DynamicObject {
private array $data = [];
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
public function __isset(string $name): bool {
return isset($this->data[$name]);
}
public function __unset(string $name): void {
unset($this->data[$name]);
}
}
$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";
Ausgabe:
REQUIRED OUTPUT FORMAT:existsDiese Methoden werden häufig verwendet, um flexible Datencontainer zu erstellen, lazy loading zu implementieren oder Objekte zu erstellen, die sich wie array verhalten und dabei eine objektorientierte Struktur beibehalten.
Aufgabe
EinfachErstellen wir einen flexiblen Konfigurationsmanager, der Einstellungen mithilfe magischer Methoden dynamisch speichert. Deine Klasse fängt den Zugriff auf Eigenschaften ab, um Konfigurationswerte zu verwalten, zu prüfen, ob Einstellungen vorhanden sind, und sie bei Bedarf zu entfernen – und das alles, ohne jede Eigenschaft ausdrücklich zu definieren.
Du organisierst deinen Code auf zwei Dateien verteilt:
Config.php: Erstelle eineConfig-Klasse, die ein privates Array verwendet, um Konfigurationswerte intern zu speichern. Implementiere alle vier magischen Eigenschaftsmethoden:__get($name): Gibt den Wert für den angegebenen Schlüssel zurück oder"undefined", wenn der Schlüssel nicht existiert__set($name, $value): Speichert den Wert unter dem angegebenen Schlüssel__isset($name): Gibt zurück, ob der Schlüssel in der Konfiguration existiert__unset($name): Entfernt den Schlüssel aus der Konfiguration
count()hinzu, die die Anzahl der gespeicherten Einstellungen zurückgibt.main.php: Binde die Config-Datei ein. Du erhältst drei Eingaben: einen Einstellungsnamen, einen Einstellungswert und einen zweiten Einstellungsnamen. Erstelle eineConfig-Instanz und führe diese Operationen aus:- Setze die erste Einstellung auf den angegebenen Wert
- Gib mithilfe von
isset()aus, ob die erste Einstellung existiert: Ausgabe"exists"oder"missing" - Gib den Wert der ersten Einstellung aus
- Gib die aktuelle Anzahl der Einstellungen aus
- Verwende
unset(), um die erste Einstellung zu entfernen - Gib aus, ob die erste Einstellung jetzt existiert: Ausgabe
"exists"oder"missing" - Gib den Wert der zweiten Einstellung aus, die nie gesetzt wurde
Jede Ausgabe sollte in einer eigenen Zeile stehen. Mit den magischen Methoden kannst du mit deinem Config-Objekt eine natürliche Eigenschaftssyntax wie $config->theme = "dark" und isset($config->theme) verwenden, obwohl keine tatsächlichen Eigenschaften definiert sind.
Probier es selbst
<?php
require_once 'Config.php';
// Eingaben lesen
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Erstelle eine Config-Instanz
// TODO: Setze die erste Einstellung auf den gegebenen Wert
// TODO: Gib aus, ob die erste Einstellung existiert ("exists" oder "missing")
// TODO: Gib den Wert der ersten Einstellung aus
// TODO: Gib die aktuelle Anzahl der Einstellungen aus
// TODO: Verwende unset(), um die erste Einstellung zu entfernen
// TODO: Gib aus, ob die erste Einstellung jetzt existiert ("exists" oder "missing")
// TODO: Gib den Wert der zweiten Einstellung aus (die nie gesetzt wurde)
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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