Ответ
Непосредственно в момент вызова __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() дополняют эту функциональность.