PHP最终在自动加载时阻止中止



我在finally块和自动加载方面遇到问题。我使用的是PHP 5.5.9。这里有一个最小的例子:

<?php
function loadMyClass($class){
include_once $class . '.php';
}
spl_autoload_register("loadMyClass");
try {
    try {
        // Test::printIt("before ");   <--- (1) Commented for now
        throw new Exception();
    }
    finally {
        echo "finally1 "
        Test::printIt("finally2 ");
    }
}
catch (Exception $e) {
    Test::printIt("catch ");
}

Test.php:

<?php
class Test {
    public static function printIt($i) { echo $i; }
}

正如您所看到的,我们抛出了一个异常,并希望运行一个finally和一个catch块。Test::printIt是一个简单的方法,它对其参数调用echo。类Test通过注册的自动加载功能加载。运行此程序将打印finally1 catch而不是finally1 finally2 catch,因此对Test::printIt(1);的调用似乎中止了finally块。问题似乎是finally块中的自动加载。如果我们取消对行(1)的注释,那么Test已经加载在finally块中。在这种情况下,before finally1 finally2 catch被正确地回显。

这里有什么问题?这是PHP中的一个错误吗?如果是,在哪个版本中进行了修复?或者是我的错,因为自动加载应该在finally块中失败?

这是php -v:输出的PHP版本

PHP 5.5.9-1ubuntu4 (cli) (built: Apr  9 2014 17:11:57) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

根据2014年4月的这份错误报告和2014年1月的这份缺陷报告(带有修复链接),这似乎是PHP中的一个错误。

指定人员的评论:

正如我们所说,这是一个已知的问题,应该在5.6+中修复,但由于ABI中断,我们无法将修复恢复到5.5…

相关内容

  • 没有找到相关文章

最新更新