我有一个finally
块和自动载入的问题。我使用PHP 5.5.9。下面是一个小例子:PHP终止块自动载入中止
<?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中的错误吗?如果是的话,哪个版本是固定的?还是这是我的错,因为自动加载最终会在块中失败?
这是我确切的PHP版本输出由php -v
:从2014年1月
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
所以,真正的错误,进行拍摄。我花了几个小时弄清楚自己的自动加载炸弹在我的代码中无处不在。猜猜这就是你使用具有不成熟功能的语言所得到的结果......无论如何,感谢你清除这些! – gexicide 2014-10-05 15:59:27
这个问题似乎被固定在v5.6.1(参见[这里](http://php.net/ChangeLog-5.php#5.6.1) – 2014-10-05 16:07:19