我在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…