Sobes.tech
Junior

Czym są metody magiczne w PHP?

sobes.tech AI

Odpowiedź od AI

Metody magiczne w PHP to specjalne metody, które są wywoływane automatycznie w określonych okolicznościach. Ich nazwy zaczynają się od dwóch podkreśleń (__).

Lista głównych metod magicznych:

  • __construct(): Wywoływana podczas tworzenia nowego obiektu.
  • __destruct(): Wywoływana podczas niszczenia obiektu.
  • __call($name, $arguments): Wywoływana podczas próby wywołania niedostępnej lub nieistniejącej metody obiektu.
  • __callStatic($name, $arguments): Wywoływana podczas próby wywołania niedostępnej lub nieistniejącej statycznej metody.
  • __get($name): Wywoływana podczas próby pobrania wartości niedostępnej właściwości obiektu.
  • __set($name, $value): Wywoływana podczas próby ustawienia wartości niedostępnej właściwości obiektu.
  • __isset($name): Wywoływana podczas użycia isset() lub empty() na niedostępnej właściwości.
  • __unset($name): Wywoływana podczas użycia unset() na niedostępnej właściwości.
  • __sleep(): Wywoływana przed serializacją, zwraca tablicę nazw właściwości do serializacji.
  • __wakeup(): Wywoływana po deserializacji.
  • __toString(): Pozwala obiektowi zachowywać się jak ciąg znaków podczas użycia w kontekście tekstowym.
  • __invoke($args): Wywoływana, gdy skrypt próbuje wywołać obiekt jak funkcję.
  • __set_state(array $properties): Wywoływana podczas eksportu obiektu funkcją var_export().
  • __clone(): Wywoływana po zakończeniu klonowania obiektu w celu skonfigurowania klona.
  • __serialize(): Wywoływana podczas serializacji, zwraca tablicę danych do serializacji.
  • __unserialize(array $data): Wywoływana podczas deserializacji, otrzymuje dane z __serialize().

Przykład użycia __construct i __destruct:

<?php
class Example {
    public function __construct() {
        echo "Obiekt utworzony\n";
    }

    public function __destruct() {
        echo "Obiekt zniszczony\n";
    }
}

$obj = new Example();
unset($obj); // Zniszczenie obiektu
?>

Przykład użycia __get i __set:

<?php
class DataStore {
    private $data = [];

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null; // Lub rzucić wyjątek
    }
}

$store = new DataStore();
$store->name = "Alice"; // Wywołuje __set
echo $store->name; // Wywołuje __get
?>