В дословном переводе — Магические Методы (Magic Methods). Эти методы зарезирвированы в php и все начинаются с двойного подчеркивания (__), вообще свои методы не рекомендуется называть используя в начале __. Список всех волшебных методов:
- __construct
- __destruct
- __call
- __callStatic
- __get
- __set
- __isset
- __unset
- __sleep
- __wakeup
- __toString
- __set_state
- __clone
Не мало, но и используются они не часто, а иногда о них просто забывают.
__construct, __destruct
Самые популярные, пожалуй, это __construct и __destruct, их знают все, это методы реализующие базовые понятия ООП: конструктор и деструктор.
__call, __get, __set
__call, __callStatic, __get и __set относятся к методам связанным с перегрузкой, т.е. мы можем выполнить к примеру такой метод $obj->ShowMeTheMoney(1000) даже если он фактически отсутствует, а на самом деле управление будет отдано вот такому методу:
function __call($m, $a) {
...
}
где $m = ‘ShowMeTheMoney’, а $a = 1000.
__get и __set выполняют похожие операции, но только со свойствами класса.
__sleep, __wakeup
__sleep и __wakeup очень интересные и специфические методы, они вызываются только из функций serialize и unserialize соответственно. __sleep будет вызвана ранее чего либо при выполнении команды serialize над данным объектом и ожидается что она вернет имена переменных, которые нужно сериализовать. __wakeup в свою очередь выполяется при десериализации и служит, к примеру, для восстановления коннекта к базе данных или еще чего-то подобного.
__toString
При обращении к классу как к строке, PHP возвращает ошибку:
$class = new TestClass('Привет');
echo $class;
Но если мы создадим волшебный метод __toString, никаких проблем не возникнет!
class TestClass
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
__clone
Последний в моем обзоре будет метод __clone, он вызывается только при клонировании объекта (оператор clone). При отсутствии этого метода, он подставится автоматически и скопирует все свойства объекта в новый. В противном случае, т.е. если мы сами, как бэтманы и супермены, описали метод __clone в нашем объекте, выполнится он, а мы же должны позаботиться о том какие свойства будут переданы в новый объект.
UPD
Хороший пример написал m-ga на я.ре.