Магические методы
Имена методов
__construct,
__destruct
(см. Конструкторы и деструкторы),
__call,
__callStatic,
__get,
__set,
__isset,
__unset
(см. Перегрузка),
__sleep,
__wakeup,
__toString,
__set_state и
__clone
зарезервированы для "магических" методов в PHP.
Не стоит называть свои методы этими именами, если вы не хотите
использовать их "магическую" функциональность.
Предостережение
PHP оставляет за собой право все методы, начинающиеся с __,
считать "магическими". Не рекомендуется использовать имена
методов с __ в PHP, если вы не желаете использовать соответствующий
"магический" функционал.
__sleep и __wakeup
Функция serialize() проверяет, присутствует ли в вашем
классе метод с "магическим" именем __sleep. Если это так,
то этот метод выполняется прежде любой операции сериализации. Он может
очистить объект и предполагается, что будет возвращен массив с именами
всех переменных объекта, который должен быть сериализован.
Если метод ничего не возвращает кроме NULL, то это значит, что объект
сериализован и выдается предупреждение E_NOTICE.
Обычно __sleep используется для передачи ожидаемых
данных или для выполнения обычных задач их очистки. Также, этот метод
можно выполнять в тех случаях, когда вы не хотите сохранять очень большие
объекты полностью.
С другой стороны, функция unserialize() проверяет
наличие метода с "магическим" именем __wakeup.
Если такой имеется, то он может воссоздать все ресурсы объекта,
которые тот имеет.
Обычно __wakeup используется для восстановления
любых соединений с базой данных, которые могли быть потеряны во время
операции сериализации и выполнения других операций повторной
инициализации.
Пример #1 Sleep и wakeup
<?php class Connection { protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } ?>
__toString
Метод __toString позволяет классу решать
самостоятельно, как он должен реагировать при преобразовании в
строку.
Пример #2 Простой пример
<?php // Декларирование простого класса class TestClass { public $foo;
public function __construct($foo) { $this->foo = $foo; }
public function __toString() { return $this->foo; } }
$class = new TestClass('Привет'); echo $class; ?>
Результат выполнения данного примера:
Ранее, до PHP 5.2.0, метод __toString вызывался
только непосредственно в сочетании с функциями echo()
или print().
Начиная с PHP 5.2.0, он вызывается в любом строчном контексте
(например, в printf() с модификатором
%s), но не в контекстах других типов (например,
с %d модификатором).
Начиная с PHP 5.2.0, преобразование объекта в строку при отсутствии
метода __toString вызывает ошибку
E_RECOVERABLE_ERROR.
__set_state
Этот статический метод
вызывается для тех классов, которые экспортируются функцией
var_export() начиная с PHP 5.1.0.
Параметр этого метода должен содержать массив, состоящий из экспортируемых
свойств в виде array('property' => value, ...).
Пример #3 Использование __set_state (начиная с PHP 5.1.0)
<?php
class A { public $var1; public $var2;
public static function __set_state($an_array) // С PHP 5.1.0 { $obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; } }
$a = new A; $a->var1 = 5; $a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array( // 'var1' => 5, // 'var2' => 'foo', // )); var_dump($b);
?>
Результат выполнения данного примера:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
|
|