__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 - 42Metoda __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:
existsTe 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ą.
Wyzwanie
ŁatwyZbudujmy 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
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ęConfigi 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)
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online