__get, __set, __isset, __unset
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 46 von 91.
PHP bietet vier magische Methoden, die den Zugriff auf Eigenschaften abfangen: __get(), __set(), __isset() und __unset(). Diese werden ausgelöst, wenn Sie versuchen, auf Eigenschaften zuzugreifen, die nicht existieren oder nicht zugänglich sind.
Die Methode __get() wird aufgerufen, wenn eine nicht zugängliche Eigenschaft gelesen wird, während __set() das Schreiben in eine solche übernimmt. Dies ermöglicht es Ihnen, dynamische Eigenschaften zu erstellen oder Logik hinzuzufü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 __isset() Methode wird durch isset() oder empty() ausgelöst, und __unset() reagiert auf die unset() Funktion:
<?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:
existsDiese Methoden werden häufig verwendet, um flexible Datencontainer zu erstellen, Lazy Loading zu implementieren oder Objekte zu erstellen, die sich wie Arrays verhalten, während sie eine objektorientierte Struktur beibehalten.
Aufgabe
EinfachLassen Sie uns einen flexiblen Konfigurationsmanager erstellen, der Einstellungen dynamisch mithilfe von magischen Methoden speichert. Ihre Klasse wird den Zugriff auf Eigenschaften abfangen, um Konfigurationswerte zu verwalten, zu prüfen, ob Einstellungen existieren, und diese bei Bedarf zu entfernen — und das alles, ohne jede Eigenschaft explizit zu definieren.
Sie werden Ihren Code in zwei Dateien organisieren:
Config.php— Erstellen Sie eine KlasseConfig, die ein privates Array verwendet, um Konfigurationswerte intern zu speichern. Implementieren Sie alle vier magischen Methoden für Eigenschaften:__get($name)— Gibt den Wert für den angegebenen Schlüssel zurück, oder"undefined", falls 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— Binden Sie die Datei Config ein. Sie erhalten drei Eingaben: einen Einstellungsnamen, einen Einstellungswert und einen zweiten Einstellungsnamen. Erstellen Sie eineConfig-Instanz und führen Sie diese Operationen aus:- Setzen Sie die erste Einstellung auf den angegebenen Wert
- Geben Sie aus, ob die erste Einstellung existiert, indem Sie
isset()verwenden — Ausgabe"exists"oder"missing" - Geben Sie den Wert der ersten Einstellung aus
- Geben Sie die aktuelle Anzahl der Einstellungen aus
- Verwenden Sie
unset(), um die erste Einstellung zu entfernen - Geben Sie aus, ob die erste Einstellung jetzt existiert — Ausgabe
"exists"oder"missing" - Geben Sie den Wert der zweiten Einstellung aus (die nie gesetzt wurde)
Jede Ausgabe sollte in einer eigenen Zeile stehen. Die magischen Methoden ermöglichen es Ihnen, mit Ihrem Config-Objekt über die natürliche Eigenschafts-Syntax wie $config->theme = "dark" und isset($config->theme) zu interagieren, obwohl keine tatsächlichen Eigenschaften definiert sind.
Spickzettel
PHP bietet vier magische Methoden zum Abfangen von Eigenschaftszugriffen:
__get(string $name): mixed— Wird beim Lesen einer nicht zugänglichen Eigenschaft aufgerufen__set(string $name, mixed $value): void— Wird beim Schreiben in eine nicht zugängliche Eigenschaft aufgerufen__isset(string $name): bool— Ausgelöst durchisset()oderempty()__unset(string $name): void— Ausgelöst durchunset()
Beispiel für __get() und __set():
<?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";
echo $obj->title; // Hello
Beispiel für __isset() und __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"; // exists
Diese Methoden ermöglichen dynamische Eigenschaften, Lazy Loading und flexible Datencontainer unter Beibehaltung der objektorientierten Struktur.
Probier es selbst
<?php
require_once 'Config.php';
// Eingaben lesen
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Eine Config-Instanz erstellen
// TODO: Die erste Einstellung auf den angegebenen Wert setzen
// TODO: Ausgeben, ob die erste Einstellung existiert ("exists" oder "missing")
// TODO: Den Wert der ersten Einstellung ausgeben
// TODO: Die aktuelle Anzahl der Einstellungen ausgeben
// TODO: unset() verwenden, um die erste Einstellung zu entfernen
// TODO: Ausgeben, ob die erste Einstellung jetzt existiert ("exists" oder "missing")
// TODO: Den Wert der zweiten Einstellung ausgeben (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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung