Zend_Loader include не вызывает исключение
Я обнаружил, что когда Zend пытается автоматически загрузить файл, который не существует, он выдает ошибку, которую я не могу перехватить в блоке try/catch. Это происходит, когда я использую class_exists
тоже. Я исправил проблему, взломав Zend:
if ($once) {
if (!@include_once ($filename)) {
throw new Exception("Failed to include $filename");
}
// include_once $filename;
}
else {
if (!@include ($filename)) {
throw new Exception("Failed to include $filename");
}
// include $filename;
}
Закомментированные строки являются оригиналами Zend. Теперь я могу поймать исключение, которое выдается, когда файл не может быть включен. Кто-нибудь может предложить более чистый способ сделать это, не включающий взлом Zend?
Я нахожусь на Zend версии 1.11.10, и рассматриваемый код - строка 146 Zend_Loader.
Благодарю.
2 ответа
Вместо использования include или include_once попробуйте использовать Zend_Loader::loadClass()
Вот API: Zend_Loader::loadClass($class, $dirs)
Пример:
Zend_Loader::loadClass('Container_Tree',
array(
'/home/production/mylib',
'/home/production/myapp'
)
);
Теперь реклама о том, как это работает:
Строка, определяющая класс, преобразуется в относительный путь, заменяя подчеркивания разделителями каталогов для вашей ОС и добавляя ".php". В приведенном выше примере * "Container_Tree" * становится "Container\Tree.php" в Windows.
Если $dirs является строкой или массивом, *Zend_Loader::loadClass()* ищет каталоги в указанном порядке. Первый соответствующий файл загружен. Если файл не существует в указанных $dirs, выполняется поиск include_path для среды PHP.
Если файл не найден или класс не существует после загрузки, *Zend_Loader::loadClass()* выдает исключение Zend_Exception.
Это должно позволить вам использовать блок try/catch для любых несуществующих классов. Zend_Loader::loadFile() также имеет аналогичную функциональность.
Не пытайтесь автоматически загружать классы, которые не существуют. Если по какой-то причине класс, который вы пытаетесь загрузить, может или не может быть там, оберните эту часть кода с помощью class_exists()
вызов.
Я не могу придумать причину, почему вы хотели бы class_exists()
выдавать исключение при сбое, поскольку его единственная цель - позволить вам проверить наличие классов.