__autoload和异常友谊问题

时间:2012-01-07 20:18:31

标签: php exception autoload

好吧,我正在开发一个框架,我正在使用__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查看完整代码,以便更好地理解。我不知道我在这里是否清楚,请在这种情况下与我联系。

2 个答案:

答案 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