8 августа 2025 г.
Магические методы в PHP - это специальные методы, имена которых начинаются с двойного подчеркивания (__) и предоставляют возможность перехватывать и обрабатывать определенные действия с объектами. Эти методы автоматически вызываются PHP в определенных ситуациях.
Магические методы (основные)
__construct()
Конструктор класса, вызывается при создании нового объекта.
class MyClass {
public function __construct() {
echo "Объект создан";
}
}
$obj = new MyClass(); // Выведет "Объект создан"
__destruct()
Деструктор, вызывается когда объект уничтожается.
class MyClass {
public function __destruct() {
echo "Объект уничтожен";
}
}
$obj = new MyClass();
unset($obj); // Выведет "Объект уничтожен"
__get($name)
Вызывается при чтении данных из недоступных (protected/private) или несуществующих свойств.
class MyClass {
private $data = [];
public function __get($name) {
return $this->data[$name] ?? null;
}
}
$obj = new MyClass();
echo $obj->nonExistentProperty; // Вызовет __get()
__set($name, $value)
Вызывается при записи данных в недоступные или несуществующие свойства.
class MyClass {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$obj = new MyClass();
$obj->newProperty = 'value'; // Вызовет __set()
__isset($name)
Вызывается при использовании isset() или empty() на недоступных или несуществующих свойствах.
class MyClass {
private $data = [];
public function __isset($name) {
return isset($this->data[$name]);
}
}
$obj = new MyClass();
isset($obj->someProperty); // Вызовет __isset()
__unset($name)
Вызывается при использовании unset() на недоступных или несуществующих свойствах.
class MyClass {
private $data = [];
public function __unset($name) {
unset($this->data[$name]);
}
}
$obj = new MyClass();
unset($obj->someProperty); // Вызовет __unset()
__call($name, $arguments)
Вызывается при вызове недоступных методов в контексте объекта.
class MyClass {
public function __call($name, $arguments) {
echo "Вызван метод $name с аргументами: " . implode(', ', $arguments);
}
}
$obj = new MyClass();
$obj->nonExistentMethod('arg1', 'arg2'); // Вызовет __call()
__callStatic($name, $arguments)
Аналогичен __call(), но для статических методов.
class MyClass {
public static function __callStatic($name, $arguments) {
echo "Вызван статический метод $name";
}
}
MyClass::nonExistentStaticMethod(); // Вызовет __callStatic()
__toString()
Позволяет классу решать, как он должен реагировать при преобразовании в строку.
class MyClass {
public function __toString() {
return "Это объект MyClass";
}
}
$obj = new MyClass();
echo $obj; // Выведет "Это объект MyClass"
__invoke(...$arguments)
Вызывается когда объект вызывается как функция.
class MyClass {
public function __invoke($x) {
echo "Объект вызван как функция с аргументом $x";
}
}
$obj = new MyClass();
$obj(5); // Выведет "Объект вызван как функция с аргументом 5"
__clone()
Вызывается при клонировании объекта с помощью ключевого слова clone.
class MyClass {
public function __clone() {
echo "Объект клонирован";
}
}
$obj1 = new MyClass();
$obj2 = clone $obj1; // Выведет "Объект клонирован"
__sleep() и __wakeup()
Используются при сериализации и десериализации объектов.
class MyClass {
private $data;
public function __sleep() {
return ['data']; // Указывает какие свойства сериализовать
}
public function __wakeup() {
// Выполняется при десериализации
}
}
__serialize() и __unserialize(array $data)
Более современная альтернатива __sleep() и __wakeup().
class MyClass {
private $data;
public function __serialize(): array {
return ['data' => $this->data];
}
public function __unserialize(array $data): void {
$this->data = $data['data'];
}
}
__debugInfo()
Определяет какие свойства должны быть выведены при использовании var_dump().
class MyClass {
private $secret = 'password';
public function __debugInfo() {
return ['publicInfo' => 'Это публичная информация'];
}
}
$obj = new MyClass();
var_dump($obj); // Покажет только publicInfo