2014-10-05 61 views
4

我有一个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; } 
} 

正如你看到的,我们抛出一个异常,并希望finallycatch块的运行。 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 

回答

4

这似乎是在PHP中的错误,根据this bug report从2014年4月和this bug report(链接到修复)。

从指定的人员注释:

我们交谈,这是一个认识问题,这应该是固定在5.6+,但由于ABI b reak,我们不能把修复至5.5 ...

+0

所以,真正的错误,进行拍摄。我花了几个小时弄清楚自己的自动加载炸弹在我的代码中无处不在。猜猜这就是你使用具有不成熟功能的语言所得到的结果......无论如何,感谢你清除这些! – gexicide 2014-10-05 15:59:27

+0

这个问题似乎被固定在v5.6.1(参见[这里](http://php.net/ChangeLog-5.php#5.6.1) – 2014-10-05 16:07:19