好吧,我正在开发一个框架,我正在使用__autoload
类和exception
。问题出在PHP 5.2 you can't catch exceptions inside __autoload上。我需要抓住它们,有一些方法可以做到吗? PHP 5.3 it works fine!
在我的框架上,你有一个包含一些类的文件夹,但是用户可以尝试加载一些不存在的类。正确的方法是测试class_exists
,但如果用户想要处理异常,我不会选择它。例如:
$obj = new NotFoundClass();
在此示例中,如果启用了框架的调试模式,则客户端将启动到错误页面,解释此问题(在类dir中找不到类NotFoundClass )。然后只如果用户没有手动捕获这个问题,我将启动一个内部错误页面,告诉客户端这个未捕获的问题。
我目前的代码就是,您可以在github page或直接在the problematic file查看完整代码,以便更好地理解。我不知道我在这里是否清楚,请在这种情况下与我联系。
答案 0 :(得分: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";
答案 1 :(得分: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