__autoload и исключение дружбы - PullRequest
1 голос
/ 08 января 2012

Ну, я разрабатываю фреймворк и работаю с __autoload классами и exception.Проблема в том, что на PHP 5.2 вы не можете перехватывать исключения внутри __autoload .Мне нужно поймать их, есть ли способ сделать это? PHP 5.3 работает нормально!

В моем фреймворке у вас есть папка, содержащая некоторые классы, но пользователь может попытаться загрузить класс, который не существует.Правильным способом является проверка, если class_exists, но я не буду делать это необязательным, если пользователь хочет работать с исключениями.Например:

$obj = new NotFoundClass();

В этом примере, если включен режим отладки фреймворка, клиент запустится на странице ошибки, объясните об этой проблеме ( класс NotFoundClass не найден в классереж ).Тогда только , если пользователь не поймает эту проблему вручную, я открою страницу внутренней ошибки, которая расскажет клиенту об этой необнаруженной проблеме.

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

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Краткий ответ на ваш вопрос:

в PHP 5.2 вы не можете перехватывать исключения внутри __autoload

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

Пример кода для перенаправления пользователя:

function missing_class_fatal_error_handler(){
    global $missing_class;
    header('Location: error_page.php?missing_class='.$missing_class);
}

function __autoload($class){
    if(version_compare(PHP_VERSION, '5.3.0') >= 0)
        throw new Exception("EXCEPTION: Class '$class' not found\n");
    else{
        global $missing_class;
        $missing_class = $class;
        register_shutdown_function('missing_class_fatal_error_handler');
    }
}
try{
    $x = new missingclass();
} catch (Exception $e){
    echo $e->getMessage(); // PHP 5.3
}
echo "this will not execute under php < 5.3";
1 голос
/ 13 января 2012

Для рассматриваемого кода:

 $obj = new NotFoundClass();

Вы можете сделать это следующим образом:

function __autoload($className) {
    $message = sprintf("Class '%s' not found.", $className);
    if(version_compare(PHP_VERSION, '5.3.0') >= 0)
        throw new Exception($message);
    else{
        eval("class $className {public function __construct() {
            throw new Exception(\"$message\");
        } }");
    }
}

$obj = new NotFoundClass();

Что вызовет исключение независимо от того, является ли это PHP 5.2 или 5.3; Демо .

...