好吧,我正在开发一个框架,我正在使用__autoload
类和exception
。问题是在PHP 5.2上,您无法在__autoload中捕获异常。我需要抓住他们,有什么办法吗PHP 5.3运行良好
在我的框架中,您有一个包含一些类的文件夹,但用户可以尝试加载一些不存在的类。正确的方法是测试class_exists
,但如果用户想处理异常,我不想让它成为可选的。例如:
$obj = new NotFoundClass();
在本例中,如果框架的调试模式处于启用状态,则客户端将被启动到一个错误页面,解释此问题(类目录中找不到类NotFoundClass)。然后只有如果用户没有手动发现这个问题,我会启动一个内部错误页面,告诉客户端这个未解决的问题。
我目前的代码是,你可以在我的github页面上或直接在有问题的文件中查看完整的代码,以更好地理解。我不知道我是否清楚,在这种情况下请和我谈谈。
问题的简短答案:
在PHP5.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";
对于有问题的代码:
$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;演示。