Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Заметки Дизайнера" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
ПЕРЕГРУЗКА
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
Полный листинг всех файлов, входящие в наш учебный пример, можно найти здесь.
| В избранное | ||


