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();

Пока все работает:)

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