3v4l.org

run code in 300+ PHP versions simultaneously
<?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