Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

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


PHP 5: Новые возможности.

Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

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

Все магические методы начинаются с двух символов подчеркивания, и, собственно говоря, все такие имена зарезервированы в PHP 5 именно для магических методов; поэтому не следует определять собственные функции и методы, названия которых начинаются таким образом.

Мы уже рассматривали функцию __autoload() и методы __construct и __destruct; __clone; __call, __get, __set, __isset и __unset. С остальными магическими методами познакомимся сейчас.

Метод __sleep был доступен уже в PHP 4. Он вызывается автоматически (если определен) при сериализации объекта (функция serialize()).

Предполагается, что метод возвращает массив строковых элементов - названий переменных, подлежащих сериализации.

Использование метода __sleep позволяет выполнить следующие задачи.

  • Произвести предварительную "очистку": освободить занимаемые ресурсы, закрыть соединение с базой данных и т. п.
  • Избежать сериализации данных, которые уже сохранены (например, в базе данных).
  • Избежать сериализации данных, которые легко могут быть восстановлены иным способом (например, вычислены из других данных).
  • Избежать сериализации несущественных данных.
  • Избежать сериализации объемных данных.

Метод __wakeup был доступен уже в PHP 4. Он вызывается автоматически (если определен) при десериализации объекта (функция unserialize()).

Метод является парным по отношению к только что рассмотренному магическому методу __sleep (так же, как функция unserialize() дополняет функцию serialize()).

Метод используется для восстановления данных, которые не были сохранены при сериализации объекта, возобновления соединения с базой данных и прочих задач по специфической инициализации объекта.

Если попытаться вывести на печать объект какого-либо класса при помощи привычных 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.

Замечание

Объект должен передаваться как самостоятельный параметр, а не как часть выражения, иначе магия не сработает.

print 'NOTE: ' . $note;
NOTE: Object id #1
print "NOTE: $note";
NOTE: Object id #1

Created with DocBook Created with Libxslt


В избранное