Почему в результате тестирования Zend Autoloader возникает ошибка, если существует несуществующий класс? - PullRequest
3 голосов
/ 22 сентября 2011

Скажем, я зарегистрировал дополнительное пространство имен "Tracker_" в файле конфигурации для некоторых классов, которые я написал, используя

autoloadernamespaces[]="Tracker_"

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

class_exists("Tracker_DoesNotExist");

Выдает исключение

include_once(Tracker/DoesNotExist.php): failed to open stream: No such file or directory
/path/Zend/Loader.php:146
/path/Zend/Loader.php:146
/path/Zend/Loader.php:94
/path/Zend/Loader/Autoloader.php:479
/path/Zend/Loader/Autoloader.php:124
/other/path/TrackablesMapper.php:40 //line referenced above

Между тем, та же функция class_exists работает для всех остальных случаев, которые я проверял, т.е.

class_exists("Application_ExistingClass"); //returns true
class_exists("Application_NonExistingClass"); //returns false
class_exists("Tracker_ExistingClass"); //returns true

Я что-то не так делаю?

Ответы [ 2 ]

6 голосов
/ 22 сентября 2011

При запуске приложения Zend Framework оно регистрирует свой автозагрузчик, используя spl_autoload_register (http://php.net/spl_autoload_register). Теперь при любых вызовах class_exists будет использоваться автозагрузчик Zend (по умолчанию class_exists пытается загрузить класс).

Причина, по которой вы получаете сообщение об ошибке при использовании class_exists с Tracker_, а не Application_, заключается в том, что автозагрузчик пространства имен приложения обрабатывается Zend_Application_Module_Autoloader (Zend_Loader_Autoloader_Resource), который действует немного иначе, чем автозагрузчик Zend_Loader.

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

Таким образом, причина того, что вы получаете ошибку с Tracker_, заключается в том, что при попытке автозагрузки не выполняется проверка ошибок, а Application_ имеет проверку ошибок.

Вы также можете подавить это, позвонив по номеру Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true); Обычно вы не хотите включать это, хотя это может создать больше путаницы позже.

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

Надеюсь, это немного прояснило для вас.

2 голосов
/ 22 сентября 2011

Вы сказали автозагрузчику Zend требовать любой класс из файла в этом пространстве имен.

class_exists() Документы запускает автозагрузчик. Если вы хотите предотвратить это, добавьте еще один параметр:

class_exists("Tracker_DoesNotExist", FALSE);

Если вы не хотите загружать классы из пространства имен Tracker_ (префикс класса), не регистрируйте его в автозагрузчике.

...