Тест на вакансию

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

8 августа 2025 г.
99
Магические методы в 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
 
 
Поделиться: