"Волшебные" методы

Имена функций:

__construct
__destruct
__call
__get
__set
__isset
__unset
__sleep
__wakeup
__toString
__set_state
__clone and
__autoload

являются "волшебными" в классах PHP. Эти имена не могут быть присвоены любым классам без ассоциации с "волшебной" функциональностью.

Предостережение

В PHP все имена функций, начинающиеся с __, резервируются, как "волшебные". Не рекомендуется использовать имена, начинающиеся с __, для целей, отличающихся от задокументированной "волшебной" функциональности.

__sleep и __wakeup

serialize() проверяет, содержится ли в классе функция с именем __sleep. Если содержится, то эта функция выполняется перед любой из операций сериализации. Она может очистить объект и предполагает возвращение массива имен всех переменных объекта, который должен быть сериализован.

Обычным использованием __sleep является закрытие соединений с любыми базами данных объекта, завершение операций и т.п. Также функция полезна в случае работы с большими объектами, в полном сохранении которых нет необходимости.

В противоположность, unserialize() проверяет присутствие функции с волшебным именем __wakeup. Если такая функция присутствует, она может реконструировать ресурсы, которые может иметь объект.

Надлежащим использованием __wakeup является восстановление соединений с базой данных, которые могли быть потеряны в процессе сериализации, и выполнение других задач реинициализации.

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()
{
mysql_close($this->link);
}

public function __wakeup()
{
$this->connect();
}
}
?>

__toString

Метод __toString позволяет классу решить, как он будет реагировать при преобразовании в строку.

Простой пример

<?php  
// Объявляем простой класс
class TestClass
{
public $foo;

public function __construct($foo) {
$this->foo = $foo;
}

public function __toString() {
return $this->foo;
}
}

$class = new TestClass('Hello');
echo $class;
?>

Результат выполнения данного примера:

Hello

Не имеет значения, что до PHP 5.2.0 метод __toString вызывался только тогда, когда он был прямо объединен с echo() или print().

__set_state

Этот статический метод вызывается для классов, экспортированных функцией var_export(), начиная с PHP 5.1.0.

Единственным параметром этого метода является массив, содержащий экспортированные свойства в форме массива array('property' => value, ...).