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

«Что такое магические методы в PHP?» — вопрос из категории PHP Core, который задают на 45% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Магические методы в PHP — это специальные методы, имена которых начинаются с двойного подчёркивания (__). Они предоставляют разработчику возможность перехватывать и определять поведение объекта при выполнении над ним определённых операций, которые иначе были бы невозможны или требовали бы дополнительного кода.

Наиболее часто используемые магические методы:

  • __construct(): Вызывается автоматически при создании нового объекта (конструктор).
  • __destruct(): Вызывается при уничтожении объекта (деструктор), полезен для освобождения ресурсов.
  • __get(string $name): Срабатывает при чтении данных из недоступных (protected/private) или несуществующих свойств.
  • __set(string $name, $value): Срабатывает при записи данных в недоступные или несуществующие свойства.
  • __isset(string $name): Срабатывает при вызове isset() или empty() на недоступном свойстве.
  • __unset(string $name): Срабатывает при вызове unset() на недоступном свойстве.
  • __toString(): Вызывается при попытке преобразовать объект в строку (например, echo $obj;).
  • __invoke(...$args): Позволяет использовать объект как функцию.

Практический пример — реализация динамических свойств:

class Config {
    private $storage = [];

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

    public function __get($name) {
        return $this->storage[$name] ?? null;
    }

    public function __isset($name) {
        return isset($this->storage[$name]);
    }
}

$config = new Config();
$config->dbHost = 'localhost'; // Вызовет __set
echo $config->dbHost; // Вызовет __get, выведет 'localhost'
var_dump(isset($config->dbHost)); // Вызовет __isset, выведет bool(true)

Важно: Злоупотребление магическими методами, особенно __get/__set, может снизить читаемость кода и производительность, а также затруднить статический анализ. Их следует использовать осознанно, например, для создания прокси-объектов или реализации паттерна Active Record.

Видео-ответы