PHP奇怪的行为:ReflectionClass :: isCloneable()调用析构函数?

时间:2016-09-23 13:28:10

标签: php reflection

请考虑以下代码:

class A {
    function __construct() { echo __FUNCTION__ . "\n"; }
    function __destruct() { echo __FUNCTION__ . "\n"; }
}

$a = new A();
$c = new ReflectionClass($a);
$c->isCloneable();

只是实例化新类,并检查它是否可以使用反射进行克隆。

输出是意外的:

__construct
__destruct
__destruct

为什么__destruct打了两次电话?在查看PHP源代码之后,似乎在ext/php_reflection/reflection.c ZEND函数isCloneable中,当反射对象没有定义zval_dtor(&obj)方法时,会调用__clone()。因此,将__clone()添加到类可修复双析构函数问题。那是什么? PHP中的错误?

P.S。在PHP 5.4和5.6中测试。

1 个答案:

答案 0 :(得分:1)

显然在7.3.5中仍然存在问题。

看起来像调用isClonable运行析构函数。它不调用构造函数。如果添加__clone,它什么也不会调用。

我的解决方案是确保析构函数可以在未初始化的类上运行(成员变量的默认设置除外)。

在此处提交了错误报告:https://bugs.php.net/bug.php?id=79115。已确认为错误。