Значения, которые печатаются, равны 11 и 12. Почему это? И есть ли способ удалить ссылку на клон?
class A {
public $z = 10;
}
$a1 = new A();
$z = &$a1->z;
$a2 = clone $a1;
$a1->z = 11;
var_dump($z);
$a2->z = 12;
var_dump($z);
Почему это?
A: Когда вы клонируете, вы также клонируете ссылку.
$z = &Ref to $a1->z [0x000F]
$a2-z = [0x000F]
$a1->z = 11; //[0x000F] = 11;
Поскольку оба экземпляра класса ссылаются на одну и ту же память, при изменении $ z изменяется значение обоих классов.
Единственный способ разыменовать это значение — сбросить его.
unset($a2->z);
$a2->z = 12;
Вот полный пример.
class A {
public $z = 10;
}
$a1 = new A();
$z = &$a1->z;
$a2 = clone $a1;
$a3 = clone $a2;
$a1->z = 11;
var_dump($z);
$a2->z = 12;
var_dump($z);
unset($a3->z);
$a3->z = 13;
var_dump($z);
var_dump($a3->z);
Выход
int(11)
int(12)
int(12) //$z
int(13) //$a3->z So $a3->z is now unlinked from the Unset
Надеюсь, это ответит на ваш вопрос
Других решений пока нет …