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

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

  Все выпуски  

ПЕРЕГРУЗКА


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

Вниманию новых подписчиков!

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

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

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

# # #

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

The Pterodactyl

Copyright 2006 Pterodactyl's School

24.02.2006

История переиздания
Издание 1.00 24.02.2006
Первоначальная версия.

Аннотация

Описаны методы, перегружающие доступ к несуществующим переменным класса и вызов несуществующих методов класса (__get, __set, __isset, __unset и __call). Доработано учебное приложение.


В PHP 5 появляется возможность перегрузки (overloading) доступа к переменным класса и вызова методов класса путем определения специальных методов: __get, __set, __isset, __unset и __call (обратите, пожалуйста, внимание на два символа подчеркивания в начале названия каждого метода). Эти методы вызываются автоматически при попытках обращения к несуществующим переменным или методам. Благодаря такой перегрузке удается заменить стандартную реакцию на попытки доступа к несуществующим переменным и методам собственной, более функциональной в данных условиях.

Внимание

Перечисленные методы нельзя объявлять как статические.

Комплексный пример использования методов перегрузки можно найти здесь.

Методы __get и __set используются для перегрузки доступа к несуществующим переменным класса, а именно к попыткам получить или установить их значение.

Обычно попытка получить значение несуществующей переменной вызывает выдачу замечания (notice) об отсутствии такой переменной, а при попытке присвоения значения несуществующей переменной происходит создание новой переменной с таким же именем и заданным значением (Пример 1, «Стандартная реакция на попытку доступа к несуществующим переменным»).

Замечание

Если же переменная существует, но недоступна (private), то попытка обращения к такой переменной не будет обработана рассматриваемыми методами и вызовет фатальную ошибку.

Использование методов __get и __set позволяет обрабатывать такие ситуации более интеллектуально. Например, представим себе следующую ситуацию. Предположим, что старая версия некоего класса в разрабатываемом приложениии содержала публичную переменную $a. Однако, новая версия того же класса еще несколько переменных, и что для удобства все эти переменные собраны в один ассоциативный массив. Но ранее разработанные скрипты, использующие данный класс (старую версию) будут продолжать обращаться к переменной $a напрямую. Даже переписав эти скрипты, нельзя быть уверенным в том, что действительно все устаревшие обращения были исправлены (не говоря уже о том, что исправления могут потребовать значительных затрат времени). Оказывается, существует вполне надежное и быстрое решение данной проблемы (Пример 2, «Использование методов __get и __set»).

Метод __get принимает один параметр (имя переменной) и должен возвратить какую-то величину. Метод __set принимает два параметра (имя переменной и ее значение).

Методы __isset и __unset, подобно двум другим методам (см. «Методы __get и __set»), служат для перегрузки доступа к несуществующим данным, а именно для замены стандартных действий, выполняемых функциями isset() и unset() соответственно (Пример 3, «Использование методов __isset и __unset»).

Оба метода принимают один параметр (название переменной). Метод __isset возвращает логическую (булеву) величину.

Внимание

Методы __isset и __unset доступны, начиная с PHP 5.1.0.

Метод __call позволяет перегрузить вызов несуществующего метода, который обычно продуцирует фатальную ошибку Пример 4, «Стандартная реакция на вызов несуществующего метода».

Метод __call принимает два параметра (имя метода и массив переданных ей аргументов) и должен возвратить какую-то величину (Пример 5, «Использование метода __call»).

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

Пока что мы определим только желательные действия для каждой из перегружаемых ситуаций, а другой важной частью разрабатываемого механизма - уведомлениями об ошибках - займемся в будущем (отсюда тэг @todo во встроенной документации - см. Пример 6, «Новые методы класса SSS 0.06»).

Безусловно, метод __isset должен возвращать логическое значение false.

    public function __isset($varname)
    {
        return false;
    }
        

Понятно также, что методы __set и __unset вообще не должны выполнять каких-либо действий, так как у них отсутствует точка приложения.

    public function __set($varname, $value)
    {
    }

    public function __unset($varname)
    {
    }
        

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

    public function __call($method, $args)
    {
        return null;
    }
        

Это же значение - null - будет возвращать и метод __get.

    public function __get($varname)
    {
        return null;
    }
        

Полный листинг всех файлов, входящие в наш учебный пример, можно найти здесь.

Created with DocBook Created with Libxslt


В избранное