Какой магический метод может вызываться вместе с __set()?

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

Ответ

Непосредственно в момент вызова __set($property, $value) другие магические методы не вызываются автоматически. Однако в типичном сценарии использования часто работает связка с методом __get().

Типичный паттерн — хранение данных в приватном массиве:

class Config implements ArrayAccess
{
    private array $data = [];
    private array $accessed = []; // Трекер обращений

    public function __get(string $name): mixed
    {
        echo "__get() вызван для '$name'.n";
        $this->accessed[$name] = true;
        return $this->data[$name] ?? null;
    }

    public function __set(string $name, mixed $value): void
    {
        echo "__set() вызван для '$name'.n";
        $this->data[$name] = $value;
    }
}

$config = new Config();
$config->timeout = 30; // Только __set()
echo $config->timeout; // Сначала __get(), потом вывод значения

Когда может вызваться __isset()? Метод __isset() может быть вызван до __set(), если в коде есть проверка существования свойства через isset() или empty() перед присваиванием.

if (!isset($obj->newProperty)) {
    // Здесь вызовется __isset('newProperty')
    $obj->newProperty = 'value'; // Затем вызовется __set()
}

Таким образом, __set() работает в паре с __get() для реализации динамических свойств, а __isset() и __unset() дополняют эту функциональность.