Вълшебни методи

Имената на функциите __construct, __destruct (Вж. също Конструктори и Деструктори), __call, __get, __set, __isset, __unset (Вж. също Предефиниране), __sleep, __wakeup, __toString, __set_state, __clone и __autoload са вълшебни в класовете на PHP. Не може да създавате функции с тези имена във вашите класове, освен ако не ги използвате по вълшебното им предназначение.

Внимание

PHP запазва всички имена на функции, започващи с __, като вълшебни. Препоръчително е да не използвате имена на функции, които започват с __ в PHP, освен ако не искате някоя документирана вълшебна функционалност.

__sleep и __wakeup

serialize() проверява дали в класа ви има функция с вълшебното име __sleep. Ако открие такава, то тази функция се изпълнява преди всякаква сериализация. Тя би могла да изчисти обекта и се очаква да върне масив с имената на всички променливи от този обект, които ще бъдат сериалзирани. Ако методът не върне нищо, тогава се сериализира стойността NULL и се генерира грешка от тип E_NOTICE.

Предназначението на __sleep е да затвори всички връзки към бази от данни, които обектът може да има, да съхрани незаписаните данни или да изпълни други подобни изчистващи задачи. Също така, функцията може да се използва и в случай, че имате много големи обекти, които няма нужда да бъдат съхранени изцяло.

Обратно, unserialize() провереява за наличието на функция с вълшебното име __wakeup. Ако тя съществува, функцията може да възстанови всички ресурси, които даден обект може да има.

Употребата на __wakeup е предназначена, да възстанови всички връзки към бази от данни, които може да са били прекъснати по време на сериализацията и за извършване на други повторно-инициализираши задачи.

Пример 19-26. Заспиване (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 позволява на даден клас да реши как ще реагира, в случай че бъде преобразуван до низ.

Пример 19-27. Прост пример

<?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, ...).