PHP奇怪的行为:ReflectionClass::IsClonable()调用析构函数?
考虑以下代码:PHP奇怪的行为:ReflectionClass::IsClonable()调用析构函数?,php,reflection,Php,Reflection,考虑以下代码: class A { function __construct() { echo __FUNCTION__ . "\n"; } function __destruct() { echo __FUNCTION__ . "\n"; } } $a = new A(); $c = new ReflectionClass($a); $c->isCloneable(); 只需实例化新类,并使用反射检查它是否可克隆 输出是意外的: __construct __destr
class A {
function __construct() { echo __FUNCTION__ . "\n"; }
function __destruct() { echo __FUNCTION__ . "\n"; }
}
$a = new A();
$c = new ReflectionClass($a);
$c->isCloneable();
只需实例化新类,并使用反射检查它是否可克隆
输出是意外的:
__construct
__destruct
__destruct
为什么要调用两次\u destruct
?查看PHP源代码后,似乎在ext/PHP\u reflection/reflection.c
ZEND函数isclonable
中,当反射对象没有定义\u clone()
方法时,调用zval\u dtor(&obj)
。因此,在类中添加\uuu clone()
可以解决双析构函数问题。那是什么?PHP中的Bug
在PHP5.4和5.6中测试了p.S.显然在7.3.5中仍然是一个问题 看起来调用isClonable会运行析构函数。它不调用构造函数。如果添加克隆,它将不调用任何内容 我的解决方案是确保析构函数可以在未初始化的类上运行(成员变量的默认设置除外)
已在此处提交错误报告:。已确认为错误。此错误已修复!