Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Заметки Дизайнера" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
ПЕРЕГРУЗКА
PHP 5: Новые возможности.
Вниманию новых подписчиков!
Обратите, пожалуйста, внимание на то, что отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.
С предыдущими выпусками Вы можете ознакомиться:
- в архиве рассылки (оригиналы выпусков);
- на сайте рассылки (исправленные и дополненные версии).
# # #
Вы также можете подписаться на рассылку "PHP 5 для начинающих".
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2005 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".
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
принимает два параметра (имя переменной и ее значение).
Пример 1. Стандартная реакция на попытку доступа к несуществующим переменным
<?php class Foo { } $foo = new Foo; $x = $foo->x; // Notice $foo->y = true; // Ok print_r($foo); ?>
Notice: Undefined property: Foo::$x Foo Object ( [y] => 1 )
Пример 2. Использование методов __get
и __set
<?php class Foo { public $properties = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); public function __get($varname) { if (isset($this->properties[$varname])) { return $this->properties[$varname]; } else { print "ERROR: There is no such variable ($varname)."; } } public function __set($varname, $value) { if (isset($this->properties[$varname])) { $this->properties[$varname] = $value; } else { print "ERROR: There is no such variable ($varname)."; } } } $foo = new Foo; $foo->a = 'x'; print $foo->a; print $foo->properties['a']; ?>
xx
Методы __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; }
Пример 6. Новые методы класса SSS 0.06
/** * Overrides access to undefined class variables * * @access public * @param string @varname Variable name * @return mixed * @since 0.06 * @todo Error messaging */ public function __get($varname) { return null; } // end func __get /** * Overrides access to undefined class variables * * @access public * @param string @varname Variable name * @param mixed @value Value to set * @since 0.06 * @todo Error messaging */ public function __set($varname, $value) { } // end func __set /** * Overrides access to undefined class variables * * @access public * @param string @varname Variable name * @return bool * @since 0.06 * @todo Error messaging */ public function __isset($varname) { return false; } // end func __isset /** * Overrides access to undefined class variables * * @access public * @param string @varname Variable name * @since 0.06 * @todo Error messaging */ public function __unset($varname) { } // end func __unset /** * Overrides call undefined class methods * * @access public * @param string @method Method name * @param array @args Array of arguments * @return mixed * @since 0.06 * @todo Error messaging */ public function __call($method, $args) { return null; } // end func __call
Полный листинг всех файлов, входящие в наш учебный пример, можно найти здесь.
В избранное | ||