PHP Inside

 
   
 

Главная


Начало
страница1
страница2
страница3
страница4
страница5
страница6
страница7
страница8
страница9
страница10
страница11
страница12
страница13
страница14
страница15
страница16
страница17
страница18
страница19
страница20
страница21
страница22
страница23
страница24
страница25
страница26
страница27
страница28
страница29
страница30
страница31
страница32
страница33
страница34
страница35
страница36
страница37
страница38
страница39
страница40
страница41
страница42
страница43
страница44
страница45
страница46
страница47
страница48
страница49
страница50
страница51
страница52
страница53
страница54
страница55
страница56
страница57
страница58
страница59
страница60
страница61
страница62
страница63
страница64
страница65
страница66
страница67
страница68
страница69
страница70
страница71
страница72
страница73
страница74
страница75
страница76
страница77
страница78
страница79
страница80
страница81
страница82
страница83
страница84
страница85
страница86
страница87
страница88
страница89

 
 
 

 

 

Но так ли необходимо в __ autoload () генерировать ис­
ключение в случае отсутствия файла ? Ответ - нет ! Де­
ло в том , что отсутствие класса , имя которого передано
в автозагрузчик , не является исключительной ситуацией .
Причиной вызова автозагрузчика может быть необходи­
мость проверки существования того или иного с помощью
class _ exists () или Reflection API . При необходимости гене­
рировать исключение , в случае попытки создания объек­
та несуществующего класса лучше использовать следую­
щий прием :

<?php

function getBalance($currencyCode)

$className = 'Balance'.$currencyCode; if(class_exists($className)){ return new $className() ) else ( throw new Exception('Class not exist:

// Создадим объект класса BalanceUSD $balance = getBalance ( USD )


.$className);


// Список автозагрузчиков ПОСЛЕ вызова

// spl_autoload_register

$loaders = spl_autoload_functions();

echo " ХпСписок автозагрузчиков ПОСЛЕ вызова J

spl_autoload_register():\ п "; foreach($loaders as $loader) {

echo $ loader ."()\ n "; } echo \ пПопытаекся создать объект несуществующего J

класса AnyNonExistantClass()\n"; $obj = new AnyNonExistantClass();


В приведенном выше примере имя класса зависит от ко­ да валюты , поэтому функция getBalance () может вернуть объект класса BalanceUSD , BalanceEUR или BalanceRUB . Если класс не существует , генерируется исключение . Дан­ ный метод предлагает надежный способ загрузки объектов , построенный на четкой логике без использования трюков , и не имеет побочных эффектов .

Таким образом , лучшей реакцией на отсутствие подклю­
чаемого файла в _ autoload () является - бездействие .

Цепочка автозагрузчиков

Иногда в приложениях требуется определить несколько ав­
тозагрузчиков . Например , если необходимо разработать мо­
дуль , который должен работать в составе приложения , в ко­
тором уже объявлена функция autoloadQ , то разработчик

не сможет определить собственную функцию _ autoloadQ

для подключения классов модуля .

Для решения данной проблемы можно воспользоваться библиотекой SPL ( Standard PHP Library ), предлагающей на­ бор функций , позволяющих управлять автозагрузчиками .

Библиотека SPL предлагает коллекцию классов , интер­фейсов , функций , способствующих решению стандартных проблем в РНР . Данная библиотека появилась в пятой вер­ сии языка , доступна по умолчанию .

<?php

function ___ autoload($className) {

echo "Try to include [".$className."] in autoload\n";

Рассмотрим пример использования SPL - функций для управления автозагрузчиками :

function loaderl($className) {

echo "Try to load [".$className."] in loaderl\n"; } function Ioader2($className) {

echo "Try to load [".$className."] in loader2\n } function Ioader3(SclassName) {

echo "Try to load [".$className."] in Ioader3\n"; )

// Список автозагрузчиков ДО вызова spl_autoload_register ^loaders = spl autoload_functions();

echo "\ пСписок автозагрузчиков ДО вызова J

spl_autoload_register():\n"; foreach($loaders as $loader) {

echo $loader."()\n";

II Регистрируем собственные функции автозагрузки spl_autoload_register('loaderl'); spl_autoload_register('Ioader2'); spl_autoload_register('Ioader3');

// Попробуем зарегистрировать Ioader 3 еще раз spl _ autoload _ register (' loader 3');


В результате исполнения приведенного выше кода вы­ водится следующий текст :