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();
?>