Saturday, February 6, 2010

Магические Методы php

В дословном переводе — Магические Методы (Magic Methods). Эти методы зарезирвированы в php. Они начинаются с двойного подчеркивания (__).
Список всех Магических методов:

* __construct
* __destruct
* __call
* __callStatic
* __get
* __set
* __isset
* __unset
* __sleep
* __wakeup
* __toString
* __set_state
* __clone


Основные и наиболее используемые методы - это __construct, __destruct, конструктор и деструктор. С ними понятно.

Существуют также __call, __get, __set.

Эти методы связанны с перегрузкой, т.е. мы можем выполнить к примеру такой метод $object->setValue(30) даже если он фактически отсутствует. Во время выполнения управление будет отдано методу __call:

function __call($m, $a) {
    ...
}
где $m = ‘getValue’, а $a = 30.

__get и __set
выполняют похожие операции, но не с методами, а со свойствами класса.

__sleep и __wakeup
вызываются только из функций serialize и unserialize.
__sleep до выполнения команды serialize над данным объектом, она возвращает имена переменных, которые нужно сериализовать.
__wakeup в свою очередь - до выполнения команды unserialize.

__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 и таким образом самому определить, какие свойства будут переданы в объект-клон.