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

 
 
 

 

 

Преимущества :

•  простые и понятные имена классов ;

•  не требует хранения пути до каждого файла , задейст­
вованного в проекте , поэтому добавление , переимено­
вание и удаление классов не требует модификации ав­
тозагрузчика .

Недостатки :

•  для загрузки класса необходимо проверить каждую пап­
ку на предмет наличия требуемого файла , что требует
некоторого количества времени ;

•  существует возможность подключения файла , не отно­
сящегося к проекту , что негативно сказывается на бе­
зопасности .

Каждый из предложенных способов имеет свои досто­ инства и недостатки , поэтому при выборе того или иного решения необходимо учитывать особенности разрабаты­ваемого проекта .

Подключение файла

РНР поддерживает несколько вариантов подключения фай­ лов - include (), include _ once (), require () и require _ once (). Вы­ берем оптимальный способ для использования в автоза­ грузчике .

При использовании операторов include _ once и require _ once подключение файла происходит только в том слу­ чае , если файл не загружен ранее . Вызов автозагрузчика свидетельствует об отсутствии требуемого класса , а зна­ чит и файл не был ранее подключен , поэтому использова­ ние include _ once и require _ once в автозагрузчике не име­ ет смысла .

Оператор require () подразумевает прекращение рабо­ ты приложения в случае отсутствия загружаемого файла , что нежелательно . Таким образом , оптимальным выбором является функция include ().

Объект не может быть загружен

Автоматическая загрузка объекта не увенчается успехом , если требующийся файл не будет найден . Одна из воз­ можных реакций на данную ситуацию - генерация исклю­ чения .

<? php

// Перехватываем исключения , которые не были пойманы // в блоках catch

function exception_handler(Sexception) { echo "Uncaught exception: J

".$exception->getMessage() ;

set_exception_handler('exception_handler')

function ___ autoload ($ className ) (

LI I Класс не существует , поэтому файл не может // быть найден if ((@ include $ className .' .php 1 ) == false) { throw new Exception('Error: can\'t find J class ' .$className);

// Пытаемся создать объект не объявленного класса try (

$obj = new AnyNonExistantClassf); } catch (Exception $e){

var _ dump ($ e );

 

Если файл AnyNonExistantClass . php отсутствует , то фун­
кция _ autoload () генерирует исключение , приводящее к до­
срочному выходу из автозагрузчика . Исключения , сгенери­
рованные в функции __ autoload , не могут быть перехваче­
ны в блоке catch или в функции exception _ handler , поэтому
исполнение данного кода завершится с ошибкой :

Fatal error: Class 'AnyNonExistantClass 1 not found 1 л /home/webdav/html/test 1 php on line 21

В Интернете есть описание трюка , позволяющего обойти данное ограничение , суть которого заключается в исполь­зовании функции eval () для создания недостающего клас­ са в момент исполнения приложения . В конструкторе клас­ са происходит генерация исключения .

<? php

function autoload ($ className ) {

if ((@ include SclassName php ) == false ) // Создадим класс , который не можем найти // и сгенерируем исключение в конструкторе eval (" class ".$ className ." (function J

_ construct!) (throw new J

Exception) 1 Class ".SclassName. 11 J not found 1 );()");

try (

$obj = new AnyNonExistantClass() ) catch (Exception $e){

// Исключение успешно перехвачено

var _ dump ($ e );

Пример реализации :

Использование подобных решений приводит к появле­ нию множества ошибок и губительно для проекта по сле­ дующим причинам :

•  данный трюк работает только при создании объекта
не объявленного класса , во всех остальных случаях
данный прием бесполезен ;

•  функция class _ exists (), используемая для проверки су­
ществования класса , всегда будет возвращать значе­
ние true , кроме того , возможны проблемы при работе
с Reflection API , что чревато появлением ошибок .