Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP奇怪的行为:ReflectionClass::IsClonable()调用析构函数?_Php_Reflection - Fatal编程技术网

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会运行析构函数。它不调用构造函数。如果添加克隆,它将不调用任何内容

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


已在此处提交错误报告:。已确认为错误。

此错误已修复!