1--TEST--
2Object serialization / unserialization: properties reference containing object
3--INI--
4error_reporting = E_ALL & ~E_STRICT
5--FILE--
6<?php
7
8function check(&$obj) {
9	var_dump($obj);
10	$ser = serialize($obj);
11	var_dump($ser);
12
13	$uobj = unserialize($ser);
14	var_dump($uobj);
15	$uobj->a = "obj->a.changed";
16	var_dump($uobj);
17	$uobj->b = "obj->b.changed";
18	var_dump($uobj);
19	$uobj->c = "obj->c.changed";
20	var_dump($uobj);
21}
22
23echo "\n\n--- a refs container:\n";
24$ext = 1;
25$obj = new stdClass;
26$obj->a = &$obj;
27$obj->b = 1;
28$obj->c = 1;
29check($obj);
30
31echo "\n\n--- a eqs container:\n";
32$ext = 1;
33$obj = new stdClass;
34$obj->a = $obj;
35$obj->b = 1;
36$obj->c = 1;
37check($obj);
38
39echo "\n\n--- a,b ref container:\n";
40$ext = 1;
41$obj = new stdClass;
42$obj->a = &$obj;
43$obj->b = &$obj;
44$obj->c = 1;
45check($obj);
46
47echo "\n\n--- a,b eq container:\n";
48$ext = 1;
49$obj = new stdClass;
50$obj->a = $obj;
51$obj->b = $obj;
52$obj->c = 1;
53check($obj);
54
55echo "\n\n--- a,b,c ref container:\n";
56$ext = 1;
57$obj = new stdClass;
58$obj->a = &$obj;
59$obj->b = &$obj;
60$obj->c = &$obj;
61check($obj);
62
63echo "\n\n--- a,b,c eq container:\n";
64$ext = 1;
65$obj = new stdClass;
66$obj->a = $obj;
67$obj->b = $obj;
68$obj->c = $obj;
69check($obj);
70
71echo "Done";
72?>
73--EXPECTF--
74--- a refs container:
75object(stdClass)#%d (3) {
76  ["a"]=>
77  *RECURSION*
78  ["b"]=>
79  int(1)
80  ["c"]=>
81  int(1)
82}
83string(55) "O:8:"stdClass":3:{s:1:"a";R:1;s:1:"b";i:1;s:1:"c";i:1;}"
84object(stdClass)#%d (3) {
85  ["a"]=>
86  *RECURSION*
87  ["b"]=>
88  int(1)
89  ["c"]=>
90  int(1)
91}
92object(stdClass)#%d (3) {
93  ["a"]=>
94  string(14) "obj->a.changed"
95  ["b"]=>
96  int(1)
97  ["c"]=>
98  int(1)
99}
100object(stdClass)#%d (3) {
101  ["a"]=>
102  string(14) "obj->a.changed"
103  ["b"]=>
104  string(14) "obj->b.changed"
105  ["c"]=>
106  int(1)
107}
108object(stdClass)#%d (3) {
109  ["a"]=>
110  string(14) "obj->a.changed"
111  ["b"]=>
112  string(14) "obj->b.changed"
113  ["c"]=>
114  string(14) "obj->c.changed"
115}
116
117
118--- a eqs container:
119object(stdClass)#%d (3) {
120  ["a"]=>
121  *RECURSION*
122  ["b"]=>
123  int(1)
124  ["c"]=>
125  int(1)
126}
127string(55) "O:8:"stdClass":3:{s:1:"a";r:1;s:1:"b";i:1;s:1:"c";i:1;}"
128object(stdClass)#%d (3) {
129  ["a"]=>
130  *RECURSION*
131  ["b"]=>
132  int(1)
133  ["c"]=>
134  int(1)
135}
136object(stdClass)#%d (3) {
137  ["a"]=>
138  string(14) "obj->a.changed"
139  ["b"]=>
140  int(1)
141  ["c"]=>
142  int(1)
143}
144object(stdClass)#%d (3) {
145  ["a"]=>
146  string(14) "obj->a.changed"
147  ["b"]=>
148  string(14) "obj->b.changed"
149  ["c"]=>
150  int(1)
151}
152object(stdClass)#%d (3) {
153  ["a"]=>
154  string(14) "obj->a.changed"
155  ["b"]=>
156  string(14) "obj->b.changed"
157  ["c"]=>
158  string(14) "obj->c.changed"
159}
160
161
162--- a,b ref container:
163object(stdClass)#%d (3) {
164  ["a"]=>
165  *RECURSION*
166  ["b"]=>
167  *RECURSION*
168  ["c"]=>
169  int(1)
170}
171string(55) "O:8:"stdClass":3:{s:1:"a";R:1;s:1:"b";R:1;s:1:"c";i:1;}"
172object(stdClass)#%d (3) {
173  ["a"]=>
174  *RECURSION*
175  ["b"]=>
176  *RECURSION*
177  ["c"]=>
178  int(1)
179}
180object(stdClass)#%d (3) {
181  ["a"]=>
182  &string(14) "obj->a.changed"
183  ["b"]=>
184  &string(14) "obj->a.changed"
185  ["c"]=>
186  int(1)
187}
188object(stdClass)#%d (3) {
189  ["a"]=>
190  &string(14) "obj->b.changed"
191  ["b"]=>
192  &string(14) "obj->b.changed"
193  ["c"]=>
194  int(1)
195}
196object(stdClass)#%d (3) {
197  ["a"]=>
198  &string(14) "obj->b.changed"
199  ["b"]=>
200  &string(14) "obj->b.changed"
201  ["c"]=>
202  string(14) "obj->c.changed"
203}
204
205
206--- a,b eq container:
207object(stdClass)#%d (3) {
208  ["a"]=>
209  *RECURSION*
210  ["b"]=>
211  *RECURSION*
212  ["c"]=>
213  int(1)
214}
215string(55) "O:8:"stdClass":3:{s:1:"a";r:1;s:1:"b";r:1;s:1:"c";i:1;}"
216object(stdClass)#%d (3) {
217  ["a"]=>
218  *RECURSION*
219  ["b"]=>
220  *RECURSION*
221  ["c"]=>
222  int(1)
223}
224object(stdClass)#%d (3) {
225  ["a"]=>
226  string(14) "obj->a.changed"
227  ["b"]=>
228  *RECURSION*
229  ["c"]=>
230  int(1)
231}
232object(stdClass)#%d (3) {
233  ["a"]=>
234  string(14) "obj->a.changed"
235  ["b"]=>
236  string(14) "obj->b.changed"
237  ["c"]=>
238  int(1)
239}
240object(stdClass)#%d (3) {
241  ["a"]=>
242  string(14) "obj->a.changed"
243  ["b"]=>
244  string(14) "obj->b.changed"
245  ["c"]=>
246  string(14) "obj->c.changed"
247}
248
249
250--- a,b,c ref container:
251object(stdClass)#%d (3) {
252  ["a"]=>
253  *RECURSION*
254  ["b"]=>
255  *RECURSION*
256  ["c"]=>
257  *RECURSION*
258}
259string(55) "O:8:"stdClass":3:{s:1:"a";R:1;s:1:"b";R:1;s:1:"c";R:1;}"
260object(stdClass)#%d (3) {
261  ["a"]=>
262  *RECURSION*
263  ["b"]=>
264  *RECURSION*
265  ["c"]=>
266  *RECURSION*
267}
268object(stdClass)#%d (3) {
269  ["a"]=>
270  &string(14) "obj->a.changed"
271  ["b"]=>
272  &string(14) "obj->a.changed"
273  ["c"]=>
274  &string(14) "obj->a.changed"
275}
276object(stdClass)#%d (3) {
277  ["a"]=>
278  &string(14) "obj->b.changed"
279  ["b"]=>
280  &string(14) "obj->b.changed"
281  ["c"]=>
282  &string(14) "obj->b.changed"
283}
284object(stdClass)#%d (3) {
285  ["a"]=>
286  &string(14) "obj->c.changed"
287  ["b"]=>
288  &string(14) "obj->c.changed"
289  ["c"]=>
290  &string(14) "obj->c.changed"
291}
292
293
294--- a,b,c eq container:
295object(stdClass)#%d (3) {
296  ["a"]=>
297  *RECURSION*
298  ["b"]=>
299  *RECURSION*
300  ["c"]=>
301  *RECURSION*
302}
303string(55) "O:8:"stdClass":3:{s:1:"a";r:1;s:1:"b";r:1;s:1:"c";r:1;}"
304object(stdClass)#%d (3) {
305  ["a"]=>
306  *RECURSION*
307  ["b"]=>
308  *RECURSION*
309  ["c"]=>
310  *RECURSION*
311}
312object(stdClass)#%d (3) {
313  ["a"]=>
314  string(14) "obj->a.changed"
315  ["b"]=>
316  *RECURSION*
317  ["c"]=>
318  *RECURSION*
319}
320object(stdClass)#%d (3) {
321  ["a"]=>
322  string(14) "obj->a.changed"
323  ["b"]=>
324  string(14) "obj->b.changed"
325  ["c"]=>
326  *RECURSION*
327}
328object(stdClass)#%d (3) {
329  ["a"]=>
330  string(14) "obj->a.changed"
331  ["b"]=>
332  string(14) "obj->b.changed"
333  ["c"]=>
334  string(14) "obj->c.changed"
335}
336Done
337