__自动加载和异常友谊问题


__autoload and exception friendship issue

好吧,我正在开发一个框架,我正在使用__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;演示。