2012-01-07 2 views
1

Ну, я разрабатываю фреймворк, и я работаю с классами __autoload и exception. Проблема в том, что на PHP 5.2 you can't catch exceptions inside __autoload. Мне нужно поймать их, есть ли способ сделать это? PHP 5.3 it works fine!__autoload и проблема дружбы с исключениями

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

$obj = new NotFoundClass(); 

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

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

+0

На первый взгляд я бы сказал: невозможно. Если вы посмотрите в 'spl_autoload_register', возможно, вы получите больше опций. – hakre

+0

Используется как 'spl_autoload_register ('core :: __ autoload');', я предполагаю, что это невозможно на PHP 5.2. –

+1

Я знаю, что он используется симулятором. Однако вы можете зарегистрировать более одного, и вы можете контролировать, какой из них последний. Последний может подделать определение класса и выдать исключение в конструкторе объектов. Это будет имитировать поведение PHP 5.3. – hakre

ответ

1

Для кода вопроса:

$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; Demo.

2

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

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

Да, возможно, лучший вариант - это не бросить, вместо этого запустить фатальную ошибку, по крайней мере, внутри метода '__autoload'. –

Смежные вопросы