Consider following code:
class A {
function __construct() { echo __FUNCTION__ . "\n"; }
function __destruct() { echo __FUNCTION__ . "\n"; }
}
$a = new A();
$c = new ReflectionClass($a);
$c->isCloneable();
Just instancing new class, and checking if it is cloneable using reflection.
The output is unexpected:
__construct
__destruct
__destruct
Why __destruct called two times? After looking into PHP source code, it seems that in ext/php_reflection/reflection.c ZEND function isCloneable occurs call to zval_dtor(&obj) when reflected object has no __clone() method defined. So, adding __clone() to class fixes the double destructor issue. What's that? Bug in PHP?
P.S. Tested in PHP 5.4 and 5.6.
Aucun commentaire:
Enregistrer un commentaire