Menu
Coddy logo textTech

__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 - 42

Die __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:

exists

Diese 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.

challenge icon

Aufgabe

Einfach

Lassen 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 Klasse Config, 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
    Fügen Sie außerdem eine Methode 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 eine Config-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 durch isset() oder empty()
  • __unset(string $name): void — Ausgelöst durch unset()

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)

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung