PHP __autoload() с обработкой исключений - пустая трата времени?
Я немного новичок в ООП и работаю над "фреймворком" для своего собственного приложения. У меня есть собственная функция автозагрузки, которая выглядит как показано ниже, а также объект обработки исключений. Я не буду использовать сторонние плагины (по крайней мере, я так не думаю).
Первый вопрос: я должен беспокоиться об обработке исключений в моей автозагрузке или я просто переусердствовал?
Второй вопрос: мой класс exceptionHandler является публичной функцией... поскольку это то, что будет использоваться многими другими приложениями, верно? Спасибо.
Спасибо.. любой вклад очень ценится.
function __autoload( $class ){
// Define filename pattern to include
$filename = $_SERVER['DOCUMENT_ROOT'] . '/../app/core/models/' . $class . '.class.php';
// Require class if it exists
try {
if ( is_readable( $filename ) ) {
require_once ( $filename );
}
else {
throw new Exception( "Class filename doesn't exist or isn't named correctly: $filename" );
}
}
catch ( Exception $e ) {
// Send to exceptionHandler Class for logging/handling.
$err = new exceptionHandler( $e, 3 );
}
}
3 ответа
Относительно вашего первого вопроса: нет, вы не должны.
Первая причина: вы всегда должны иметь возможность связывать несколько автозагрузчиков (см. spl_autoload_register
), поэтому в случае сбоя одного автозагрузчика второй может загрузить этот класс. Из-за этого ваш автозагрузчик не должен выдавать никаких ошибок, если вы точно не знаете, что делаете.
Вторая причина: если все попытки автозагрузки завершатся неудачно, php все равно вызовет ошибку. Правильно регистрируйте свои ошибки php, и вам не нужно регистрировать это в своем автозагрузчике.
Третья причина: ваш автозагрузчик будет частью кода, который будет выполняться много. Вам не нужен блок try / catch здесь.
Помимо этого: что происходит, если автозагрузка вашего exceptionHandler
терпит неудачу...?
Любая функция автозагрузки на самом деле не предназначена для создания исключений, потому что неясно, где должно возникать это исключение, и вам придется либо обернуть весь код в блок try catch, либо определить обработчик исключений.
Вы должны вызвать ошибку через trigger_error
или даже лучше, пусть PHP скажет вам, что это за класс, который не может загружаться в реальной строке, где это происходит (поэтому просто игнорирует файлы, которые не существуют).
Также вы не должны использовать __autoload
но spl_autoload_register
,
Спасибо за отзывы Джеффри и Александра. Вы, ребята, заставили меня задуматься.. В итоге я удалил свой автозагрузчик для более простого (и более быстрого?) Метода...
В моем конфигурационном файле я добавил путь включения для основных классов приложений, а также классов модулей:
set_include_path( get_include_path() . PATH_SEPARATOR . APPLICATION_ROOT . 'core' . DIRECTORY_SEPARATOR . PATH_SEPARATOR . APPLICATION_ROOT . 'module' . DIRECTORY_SEPARATOR );
spl_autoload_extensions( '.class.php' );
spl_autoload_register();
Пока все работает:)