<?php
class A {
public B|C $x;
public function __construct(B|C $x) {
$this->x = $x;
}
public function __sleep()
{
return ['x'];
}
}
class B {
public A $a;
public function __serialize()
{
return ['a' => new A($this)];
}
}
class C {
public A $a;
private self $instance;
public function __serialize()
{
return ['a' => new A($this)];
}
public function __clone() {
$this->instance = $this;
}
}
// instantiate
$b = new B();
$c = new C();
// clone and assign
$ib = clone $b;
$ic = clone $c;
// serialize
$sb = serialize($b);
$scb = serialize(clone $b);
$sib = serialize($ib);
$sc = serialize($c);
$scc = serialize(clone $c);
$sic = serialize($ic);
// unserialize
$ub = unserialize($sb);
$ucb = unserialize($scb);
$uib = unserialize($sib);
$uc = unserialize($sc);
$ucc = unserialize($scc);
$uic = unserialize($sic);
// expected behavior is b == b->a->x
printf("original ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($ub), spl_object_id($ub->a), spl_object_id($ub->a->x));
printf("cloned ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($ucb), spl_object_id($ucb->a), spl_object_id($ucb->a->x));
printf("cloned & assigned ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($uib), spl_object_id($uib->a), spl_object_id($uib->a->x));
printf(PHP_EOL);
// expected behavior is c == c->a->x
printf("original ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($uc), spl_object_id($uc->a), spl_object_id($uc->a->x));
printf("cloned ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($ucc), spl_object_id($ucc->a), spl_object_id($ucc->a->x));
printf("cloned & assigned ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($uic), spl_object_id($uic->a), spl_object_id($uic->a->x));
printf(PHP_EOL);
printf("serialized original: %s\n", $sb);
printf("serialized clone : %s\n", $scb);
preferences:
26.46 ms | 407 KiB | 5 Q