Назад к вопросам
Junior
146
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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
?>