Menu
Coddy logo textTech

__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()- wird beim Lesen einer nicht zugänglichen Eigenschaft aufgerufen, während __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 - 42

Die 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: [Your translated content here]
exists

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

challenge icon

Aufgabe

Einfach

Erstellen 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 eine Config-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
    Füge außerdem eine Methode 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 eine Config-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)

?>
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

Übe selbstständig: Online-PHP-Compiler