__autoload и проблема дружбы с исключениями

59
4

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

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

$obj = new NotFoundClass();

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

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

спросил(а) 2012-01-07T23:18:00+04:00 8 лет, 11 месяцев назад
1
Решение
59

Для кода, о котором идет речь:

 $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; Демо.

ответил(а) 2012-01-13T12:17:00+04:00 8 лет, 10 месяцев назад
72

Короткий ответ, из вашего вопроса:

на 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";

ответил(а) 2012-01-08T02:56:00+04:00 8 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема