<?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);
- Output for 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.26, 8.4.1 - 8.4.13
- original ids: b:6, b->a:7, b->a->x:6
cloned ids: b:8, b->a:9, b->a->x:10
cloned & assigned ids: b:12, b->a:13, b->a->x:12
original ids: c:14, c->a:15, c->a->x:14
cloned ids: c:16, c->a:17, c->a->x:16
cloned & assigned ids: c:18, c->a:19, c->a->x:18
serialized original: O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
serialized clone : O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:3;}}}}
- Output for 8.0.1 - 8.0.30
- original ids: b:6, b->a:7, b->a->x:6
cloned ids: b:8, b->a:9, b->a->x:8
cloned & assigned ids: b:10, b->a:11, b->a->x:10
original ids: c:12, c->a:13, c->a->x:12
cloned ids: c:14, c->a:15, c->a->x:14
cloned & assigned ids: c:16, c->a:17, c->a->x:16
serialized original: O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
serialized clone : O:1:"B":1:{s:1:"a";O:1:"A":1:{s:1:"x";r:1;}}
preferences:
88.03 ms | 408 KiB | 5 Q