4. Коротко ООП PHP - Магические методы (magic methods) __
Магиеские методы - "магия" данных методов сводится к тому, что они могут перехватывать (отсюда их второе название - методы-перехватчики) сообщения, посланные неопределенным (по сути - несуществующим) методам и свойствам
Всегда начинаются с двойного подчеркивания.
__construct() - этот метод запускается автоматически при созданнии экземпляра класса
__destruct() - метод запускается автоматически при уничтожении обьекта
__call(), __callStatic() - перехватывают обращение к несуществующему методу в контексте объекта и в статическом контексте
__get(), __set() - выполняется при чтении/записи данных из недоступных свойств
__isset() - будет выполнен при использовании isset() или empty() на недоступных свойствах
__unset() - будет выполнен при вызове unset() на недоступном свойстве
__sleep() - вызывается, когда объект подвергается сериализации при помощи функции serialize()
__wakeup() - вызывается при восстановлении объекта при помощи функции unserialize()
__toString() - метод, с помощью которого можно обращаться к классу как к строке
__invoke() - вызывается при попытке использовать объект в качестве функции
__set_state() - метод, который вызывается для классов, экспортирующих значения свойств функцией var_export()
__clone() - вызывается при клонировании объекта
__debugInfo() - метод вызывается функцией var_dump(), когда необходимо вывести список свойств объекта
<?php
class Car {
function __construct() {
echo 'Конструктор, вызывается автоматически во время создания экземпляра класса <br/>';
}
function __destruct() {
echo 'Деструктор, вызывается автоматически во время уничтожения экземпляра класса <br/>';
}
function __call($name, $arguments) {
// значение $name регистрозависимо
echo "Вызов метода '$name' " . implode(', ', $arguments). "<br/>";
}
static function __callStatic($name, $arguments) {
echo "Вызов статического метода '$name' " . implode(', ', $arguments). "<br/>";
}
function __get($param) {
echo "Выполнить из за чтения данных из недоступных свойств: $param <br/>";
}
function __set($name, $value) {
echo "Выполнить метод из за записи данных в недоступные свойства: $name -> $value <br/>";
return $this->{$name} = $value;
}
function __isset($name) {
echo "Установлено ли '$name'? <br/>";
// return isset($this->data[$name]);
}
function __unset($name) {
echo "Уничтожение '$name' <br/>";
// unset($this->data[$name]);
}
function __sleep() {
echo "Объект подвергается сериализации при помощи функции serialize <br/>";
}
// function __wakeup() {
// echo "Объект подвергается восстановлении при помощи функции unserialize <br/>";
// }
function __toString() {
return "Мы вызвали " . __METHOD__ . "<br/>";
}
function __invoke($vars) {
return "Нельзя вызывать класс как функцию <br/>";
}
function __set_state($an_array) {
return print_r($an_array) . "<br/>";
}
function __clone() {
echo 'Вызывается при клонировании объекта <br/>';
}
function __debugInfo() {
echo 'Вызывается при var_dump <br/>';
}
}
$car = new Car(); // __construct
$car->runTest('в контексте объекта'); // __call
car::runTest('в статическом контексте объекта'); // __callStatic
$car->asdfasdf; // __get
$car->asdfasdf = 'test'; // __set
isset($car->a); // __isset
isset($car->b); // __unset
$a = serialize($car); // __sleep
// unserialize($a); // __wakeup
echo $car; // __toString
echo $car('Пиу'); // __invoke
eval('$b = ' . var_export($car, true) . ';');
var_dump($b); // __set_state
$car2 = clone $car; // __clone
var_dump($car2); // __debugInfo