请考虑以下代码:
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中测试。
答案 0 :(得分:1)
显然在7.3.5中仍然存在问题。
看起来像调用isClonable运行析构函数。它不调用构造函数。如果添加__clone,它什么也不会调用。
我的解决方案是确保析构函数可以在未初始化的类上运行(成员变量的默认设置除外)。
在此处提交了错误报告:https://bugs.php.net/bug.php?id=79115。已确认为错误。