xref: /PHP-8.3/ext/spl/tests/bug45826.phpt (revision c6357b80)
1--TEST--
2ArrayObject/ArrayIterator : serialization
3--FILE--
4<?php
5$o = new ArrayObject();
6$y = new StdClass;
7$o->append($y);
8$o->append($y);
9$o->append($o);
10
11var_dump($o[0] === $o[1]);
12var_dump($o[2] === $o);
13
14$s1 = serialize($o);
15$s2 = $o->serialize();
16var_dump($s1);
17var_dump($s2);
18
19$o1 = unserialize($s1);
20
21var_dump($o1[0] === $o1[1]);
22var_dump($o1[2] === $o1);
23
24$o2 = new ArrayObject();
25$o2->unserialize($s2);
26
27var_dump($o2[0] === $o2[1]);
28var_dump($o2[2] !== $o2);
29var_dump($o2[2][2] === $o2[2]);
30
31echo "#### Extending ArrayObject\n";
32unset($o,$x,$s1,$s2,$o1,$o2);
33class ArrayObject2 extends ArrayObject {
34    public function __serialize(): array {
35        return parent::__serialize();
36    }
37
38    public function __unserialize($s): void {
39        parent::__unserialize($s);
40    }
41}
42
43$o = new ArrayObject2();
44$y = new StdClass;
45$o->append($y);
46$o->append($y);
47$o->append($o);
48
49var_dump($o[0] === $o[1]);
50var_dump($o[2] === $o);
51
52$s1 = serialize($o);
53$s2 = $o->__serialize();
54var_dump($s1);
55var_dump($s2);
56
57$o1 = unserialize($s1);
58
59var_dump($o1[0] === $o1[1]);
60var_dump($o1[2] === $o1);
61
62$o2 = new ArrayObject2();
63$o2->__unserialize($s2);
64
65var_dump($o2[0] === $o2[1]);
66var_dump($o2[2] !== $o2);
67var_dump($o2[2][2] === $o2[2]);
68?>
69--EXPECT--
70bool(true)
71bool(true)
72string(96) "O:11:"ArrayObject":4:{i:0;i:0;i:1;a:3:{i:0;O:8:"stdClass":0:{}i:1;r:4;i:2;r:1;}i:2;a:0:{}i:3;N;}"
73string(137) "x:i:0;a:3:{i:0;O:8:"stdClass":0:{}i:1;r:3;i:2;O:11:"ArrayObject":4:{i:0;i:0;i:1;a:3:{i:0;r:3;i:1;r:3;i:2;r:5;}i:2;a:0:{}i:3;N;}};m:a:0:{}"
74bool(true)
75bool(true)
76bool(true)
77bool(true)
78bool(true)
79#### Extending ArrayObject
80bool(true)
81bool(true)
82string(97) "O:12:"ArrayObject2":4:{i:0;i:0;i:1;a:3:{i:0;O:8:"stdClass":0:{}i:1;r:4;i:2;r:1;}i:2;a:0:{}i:3;N;}"
83array(4) {
84  [0]=>
85  int(0)
86  [1]=>
87  array(3) {
88    [0]=>
89    object(stdClass)#8 (0) {
90    }
91    [1]=>
92    object(stdClass)#8 (0) {
93    }
94    [2]=>
95    object(ArrayObject2)#5 (1) {
96      ["storage":"ArrayObject":private]=>
97      *RECURSION*
98    }
99  }
100  [2]=>
101  array(0) {
102  }
103  [3]=>
104  NULL
105}
106bool(true)
107bool(true)
108bool(true)
109bool(true)
110bool(true)
111