Sobes.tech
Junior

Какви са магическите методи в PHP?

sobes.tech AI

Отговор от AI

Магическите методи в PHP са специални методи, които се извикват автоматично при определени обстоятелства. Техните имена започват с две долни черти (__).

Списък на основните магически методи:

  • __construct(): Извиква се при създаване на нов обект.
  • __destruct(): Извиква се при унищожаване на обекта.
  • __call($name, $arguments): Извиква се при опит да се извика недостъпна или несъществуваща метод на обекта.
  • __callStatic($name, $arguments): Извиква се при опит да се извика недостъпна или несъществуваща статична метод.
  • __get($name): Извиква се при опит да се получи стойността на недостъпна собственост на обекта.
  • __set($name, $value): Извиква се при опит да се зададе стойността на недостъпна собственост на обекта.
  • __isset($name): Извиква се при използване на isset() или empty() върху недостъпна собственост.
  • __unset($name): Извиква се при използване на unset() върху недостъпна собственост.
  • __sleep(): Извиква се преди сериализация, връща масив с имената на свойствата за сериализация.
  • __wakeup(): Извиква се след десериализация.
  • __toString(): Позволява на обекта да се държи като низ при използване в низов контекст.
  • __invoke($args): Извиква се, когато скриптът се опитва да извика обекта като функция.
  • __set_state(array $properties): Извиква се при експортиране на обекта с функцията var_export().
  • __clone(): Извиква се след завършване на клонирането на обекта за настройка на клона.
  • __serialize(): Извиква се по време на сериализация, връща масив с данни за сериализация.
  • __unserialize(array $data): Извиква се по време на десериализация, получава данните от __serialize().

Примери за използване на __construct и __destruct:

<?php
class Example {
    public function __construct() {
        echo "Обект създаден\n";
    }

    public function __destruct() {
        echo "Обект унищожен\n";
    }
}

$obj = new Example();
unset($obj); // Принудително унищожаване на обекта
?>

Примери за използване на __get и __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; // Или хвърлете изключение
    }
}

$store = new DataStore();
$store->name = "Alice"; // Обажда __set
echo $store->name; // Обажда __get
?>