Шаблоны проектирования
Ключевое слово "final"
Классы и объекты (PHP 5)
PHP Manual

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

Имена методов __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"
    }

Шаблоны проектирования
Ключевое слово "final"
Классы и объекты (PHP 5)
PHP Manual