6.11. Перезагрузка на пользовательском уровне
В PHP 4 для разработчиков модулей была добавлена возможность перезагружать объектно-ориентированный синтаксис и создавать распределения во внешние объектные модели, созданные с помощью Java или COM. PHP 5 позволяет применять объектно-ориентированную перезагрузку для разработчиков PHP и предоставляет им возможность создавать настраиваемое поведение для доступа к свойствам и вызовам методов. Перезагрузка на пользовательском уровне осуществляется при определении одного или нескольких следующих методов: __get, __set и __call. PHP вызывает эти методы в том случае, если процессор Zend Engine делает попытку доступа к элементу, но не находит его в текущем диапазоне.
В листинге 6.14 методы_get и_set получают доступ ко всем свойствам массива
properties. По мере необходимости можно применить любой нужный фильтр. Например, этот сценарий может запретить установку свойств, которые начинаются с определенного префикса или содержат определенный тип значений.
Метод_call иллюстрирует, каким образом можно перехватить обращения к неопределенным методам. При этом будут получены имя метода и массив, содержащий список аргументов метода. PHP возвращает значение __call как возвращаемое значение ненайденного метода.
Листинг 6.14. Перезагрузка на пользовательском уровне
<?php
class Overloader
{
private $properties = array(); function __get($property_name)
{
if(isset($this->properties[$property_name]))
{
return($this->properties[$property_name]);
}
else
{
return(NULL);
}
}
function __set($property_name, $value)
{
$this->properties[$property_name] = $value;
}
function __call($function_name, $args)
{
print("Вызов $function_name()<br>n"); print("Аргументы: "); print_r($args); return(TRUE);
}
}
$o = new Overloader(); // вызвать __set()
$o->dynaProp = "Dynamic Content"; // вызвать __get() print($o->dynaProp . "<br>n"); // вызвать __call() $o->dynaMethod("Leon", "Zeev");
?>
6.12. Автозагрузка класса
При попытке использования еще не определенного класса PHP выдает фатальную ошибку. Очевидным решением в такой ситуации является добавление определения класса с помощью оператора include. После всего необходимо знать, какие классы использует в своей работе сценарий. Однако PHP имеет возможность автозагрузки классов, что позволяет экономить время на программировании. При попытке использования класса, который PHP не может распознать, он осуществляет поиск глобальной функции __autoload. Если она существует, PHP вызывает ее с единственным параметром, представляющим собой имя класса. Внутри функции можно предпринять все действия, необходимые для создания класса.
В примере, представленном в листинге 6.15, продемонстрировано использование функции __autoload. При этом используется упрощенная схема, предполагающая соответствие файлов текущего каталога любому классу. Когда сценарий делает попытку получить экземпляр User, PHP выполняет функцию_autoload. Это делается
в предположении, что модуль class_User.php содержит объявление класса. Независимо от того, какой регистр используется для активизации класса, PHP возвращает имя в нижнем регистре.
| Листинг 6.15. Автозагрузка класса_
<?php
//определение функции автозагрузки function __autoload($class)
{
include("class_" . ucfirst($class) . ".php");
}
//использовать класс, который будет загружаться автоматически $u = new User; $u->name = "Leon"; $u->printName();
?>
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
PHP. Классы и объекты. Часть Одиннадцатая.
28-12-2009
<< Предыдущая статья | Следующая статья >> |
PHP. Классы и объекты. Часть Десятая. | PHP. Классы и объекты. Часть Двеннадцатая. |