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() выдавать исключение при сбое, поскольку его единственная цель - позволить вам проверить наличие классов.

Другие вопросы по тегам