Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
Магические методы
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
17.03.2006
История переиздания
Издание 1.00
17.03.2006
Первоначальная версия.
Аннотация
Рассмотрены магические методы __sleep, __wakeup и __toString.
PHP поддерживает ряд магических функций и методов, которые, если определены, вызываются автоматически при определенных обстоятельствах. Некоторые такие методы появились еще в PHP 4, но большинство доступны только в PHP 5.
Все магические методы начинаются с двух символов подчеркивания, и, собственно говоря, все такие имена зарезервированы в PHP 5 именно для магических методов; поэтому не следует определять собственные функции и методы, названия которых начинаются таким образом.
Мы уже рассматривали функцию __autoload() и методы __construct и __destruct; __clone; __call, __get, __set, __isset и __unset. С остальными магическими методами познакомимся сейчас.
Метод __sleep
Метод __sleep был доступен уже в PHP 4. Он вызывается автоматически (если определен) при сериализации объекта (функция serialize()).
Предполагается, что метод возвращает массив строковых элементов - названий переменных, подлежащих сериализации.
Использование метода __sleep позволяет выполнить следующие задачи.
Произвести предварительную "очистку": освободить занимаемые ресурсы, закрыть соединение с базой данных и т. п.
Избежать сериализации данных, которые уже сохранены (например, в базе данных).
Избежать сериализации данных, которые легко могут быть восстановлены иным способом (например, вычислены из других данных).
Избежать сериализации несущественных данных.
Избежать сериализации объемных данных.
Метод __wakeup
Метод __wakeup был доступен уже в PHP 4. Он вызывается автоматически (если определен) при десериализации объекта (функция unserialize()).
Метод является парным по отношению к только что рассмотренному магическому методу __sleep (так же, как функция unserialize() дополняет функцию serialize()).
Метод используется для восстановления данных, которые не были сохранены при сериализации объекта, возобновления соединения с базой данных и прочих задач по специфической инициализации объекта.
Метод __toString
Если попытаться вывести на печать объект какого-либо класса при помощи привычных print или echo, получим следующее.
print new stdClass;
Object id #1
Конечно, хотелось бы чего-то более информативного. С целью отладки вполне подойдет функция print_r().
print_r(new stdClass);
stdClass Object
(
)
Однако, для представления объектов, в большей мере ориантированного на конечного пользователя, необходимо определить специальный метод (например, toString). Допустим, мы разрабатываем класс Note, объекты которого будут хранить наши замечания.
<?php
class Note {
private $note;
function __construct($note)
{
$this->note = $note;
}
public function toString()
{
return $this->note;
}
}
?>
<?php
$note = new Note('Just a test.');
print $note->toString();
?>
Just a test.
PHP 5 позволяет осуществлять вывод объектов на печать еще более удобным способом, подобно обычным (скалярным) переменным. Для этого необходимо определить магический метод __toString, который будет автоматически вызываться при печати объекта с помощью print или echo.
Подсказка
Можно, конечно, обойтись и без промежуточного метода toString, а переменную $this->note возвращать непосредственно из __toString.
class Note {
/* ... */
function __toString()
{
return $this->toString();
}
}
<?php
$note = new Note('Just a test.');
print $note;
?>
Just a test.
Замечание
Объект должен передаваться как самостоятельный параметр, а не как часть выражения, иначе магия не сработает.