Menu
Coddy logo textTech

__get, __set, __isset, __unset

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 46 z 91.

PHP udostępnia cztery magiczne metody, które przechwytują dostęp do właściwości: __get(), __set(), __isset() i __unset(). Są wywoływane, gdy próbujesz uzyskać dostęp do właściwości, które nie istnieją lub są niedostępne.

Metoda __get() jest wywoływana podczas odczytu niedostępnej właściwości, natomiast __set() obsługuje zapis do niej. Dzięki temu możesz tworzyć właściwości dynamiczne lub dodawać logikę wykonywaną podczas dostępu do właściwości:

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

Wynik:

Hello - 42

Metoda __isset() jest wywoływana przez isset() lub empty(), a metoda __unset() reaguje na funkcję 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";

Wynik:

exists

Te metody są powszechnie używane do tworzenia elastycznych kontenerów danych, implementowania leniwego ładowania lub budowania obiektów, które zachowują się jak tablice, a jednocześnie utrzymują strukturę obiektową.

challenge icon

Wyzwanie

Łatwy

Zbudujmy elastyczny menedżer konfiguracji, który dynamicznie przechowuje ustawienia za pomocą metod magicznych. Twoja klasa będzie przechwytywać dostęp do właściwości, aby zarządzać wartościami konfiguracji, sprawdzać, czy ustawienia istnieją, i usuwać je w razie potrzeby — a wszystko to bez jawnego definiowania każdej właściwości.

Rozmieścisz swój kod w dwóch plikach:

  • Config.php: Utwórz klasę Config, która używa prywatnej tablicy do wewnętrznego przechowywania wartości konfiguracji. Zaimplementuj wszystkie cztery magiczne metody właściwości:
    • __get($name): Zwraca wartość dla podanego klucza lub "undefined", jeśli klucz nie istnieje
    • __set($name, $value): Zapisuje wartość pod podanym kluczem
    • __isset($name): Zwraca informację, czy klucz istnieje w konfiguracji
    • __unset($name): Usuwa klucz z konfiguracji
    Dodaj też metodę count(), która zwraca liczbę przechowywanych ustawień.
  • main.php: Dołącz plik Config. Otrzymasz trzy dane wejściowe: nazwę ustawienia, wartość ustawienia i nazwę drugiego ustawienia. Utwórz instancję Config i wykonaj następujące operacje:
    • Ustaw pierwsze ustawienie na podaną wartość
    • Wypisz, czy pierwsze ustawienie istnieje, używając isset(): wyświetl "exists" lub "missing"
    • Wypisz wartość pierwszego ustawienia
    • Wypisz bieżącą liczbę ustawień
    • Użyj unset(), aby usunąć pierwsze ustawienie
    • Wypisz, czy pierwsze ustawienie teraz istnieje: wyświetl "exists" lub "missing"
    • Wypisz wartość drugiego ustawienia (które nigdy nie zostało ustawione)

Każdy wynik powinien znaleźć się w osobnym wierszu. Metody magiczne pozwalają korzystać z obiektu Config za pomocą naturalnej składni właściwości, takiej jak $config->theme = "dark" i isset($config->theme), mimo że nie zdefiniowano żadnych rzeczywistych właściwości.

Spróbuj swoich sił

<?php

require_once 'Config.php';

// Wczytaj dane wejściowe
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: Utwórz instancję Config

// TODO: Ustaw pierwsze ustawienie na podaną wartość

// TODO: Wypisz, czy pierwsze ustawienie istnieje ("exists" lub "missing")

// TODO: Wypisz wartość pierwszego ustawienia

// TODO: Wypisz aktualną liczbę ustawień

// TODO: Użyj unset(), aby usunąć pierwsze ustawienie

// TODO: Wypisz, czy pierwsze ustawienie teraz istnieje ("exists" lub "missing")

// TODO: Wypisz wartość drugiego ustawienia (które nigdy nie zostało ustawione)

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online