1--TEST--
2Object serialization / unserialization: references amongst properties
3--INI--
4error_reporting = E_ALL & ~E_STRICT
5--FILE--
6<?php
7/* Prototype  : proto string serialize(mixed variable)
8 * Description: Returns a string representation of variable (which can later be unserialized)
9 * Source code: ext/standard/var.c
10 * Alias to functions:
11 */
12/* Prototype  : proto mixed unserialize(string variable_representation)
13 * Description: Takes a string representation of variable and recreates it
14 * Source code: ext/standard/var.c
15 * Alias to functions:
16 */
17
18function check(&$obj) {
19	var_dump($obj);
20	$ser = serialize($obj);
21	var_dump($ser);
22
23	$uobj = unserialize($ser);
24	var_dump($uobj);
25	$uobj->a = "obj->a.changed";
26	var_dump($uobj);
27	$uobj->b = "obj->b.changed";
28	var_dump($uobj);
29	$uobj->c = "obj->c.changed";
30	var_dump($uobj);
31}
32
33echo "\n\n--- a refs b:\n";
34$obj = new stdClass;
35$obj->a = &$obj->b;
36$obj->b = 1;
37$obj->c = 1;
38check($obj);
39
40echo "\n\n--- a refs c:\n";
41$obj = new stdClass;
42$obj->a = &$obj->c;
43$obj->b = 1;
44$obj->c = 1;
45check($obj);
46
47echo "\n\n--- b refs a:\n";
48$obj = new stdClass;
49$obj->a = 1;
50$obj->b = &$obj->a;
51$obj->c = 1;
52check($obj);
53
54echo "\n\n--- b refs c:\n";
55$obj = new stdClass;
56$obj->a = 1;
57$obj->b = &$obj->c;
58$obj->c = 1;
59check($obj);
60
61echo "\n\n--- c refs a:\n";
62$obj = new stdClass;
63$obj->a = 1;
64$obj->b = 1;
65$obj->c = &$obj->a;
66check($obj);
67
68echo "\n\n--- c refs b:\n";
69$obj = new stdClass;
70$obj->a = 1;
71$obj->b = 1;
72$obj->c = &$obj->b;
73check($obj);
74
75echo "\n\n--- a,b refs c:\n";
76$obj = new stdClass;
77$obj->a = &$obj->c;
78$obj->b = &$obj->c;
79$obj->c = 1;
80check($obj);
81
82echo "\n\n--- a,c refs b:\n";
83$obj = new stdClass;
84$obj->a = &$obj->b;
85$obj->b = 1;
86$obj->c = &$obj->b;
87check($obj);
88
89echo "\n\n--- b,c refs a:\n";
90$obj = new stdClass;
91$obj->a = 1;
92$obj->b = &$obj->a;
93$obj->c = &$obj->a;
94check($obj);
95
96echo "Done";
97?>
98--EXPECTF--
99
100--- a refs b:
101object(stdClass)#%d (3) {
102  ["b"]=>
103  &int(1)
104  ["a"]=>
105  &int(1)
106  ["c"]=>
107  int(1)
108}
109string(55) "O:8:"stdClass":3:{s:1:"b";i:1;s:1:"a";R:2;s:1:"c";i:1;}"
110object(stdClass)#%d (3) {
111  ["b"]=>
112  &int(1)
113  ["a"]=>
114  &int(1)
115  ["c"]=>
116  int(1)
117}
118object(stdClass)#%d (3) {
119  ["b"]=>
120  &string(14) "obj->a.changed"
121  ["a"]=>
122  &string(14) "obj->a.changed"
123  ["c"]=>
124  int(1)
125}
126object(stdClass)#%d (3) {
127  ["b"]=>
128  &string(14) "obj->b.changed"
129  ["a"]=>
130  &string(14) "obj->b.changed"
131  ["c"]=>
132  int(1)
133}
134object(stdClass)#%d (3) {
135  ["b"]=>
136  &string(14) "obj->b.changed"
137  ["a"]=>
138  &string(14) "obj->b.changed"
139  ["c"]=>
140  string(14) "obj->c.changed"
141}
142
143
144--- a refs c:
145object(stdClass)#%d (3) {
146  ["c"]=>
147  &int(1)
148  ["a"]=>
149  &int(1)
150  ["b"]=>
151  int(1)
152}
153string(55) "O:8:"stdClass":3:{s:1:"c";i:1;s:1:"a";R:2;s:1:"b";i:1;}"
154object(stdClass)#%d (3) {
155  ["c"]=>
156  &int(1)
157  ["a"]=>
158  &int(1)
159  ["b"]=>
160  int(1)
161}
162object(stdClass)#%d (3) {
163  ["c"]=>
164  &string(14) "obj->a.changed"
165  ["a"]=>
166  &string(14) "obj->a.changed"
167  ["b"]=>
168  int(1)
169}
170object(stdClass)#%d (3) {
171  ["c"]=>
172  &string(14) "obj->a.changed"
173  ["a"]=>
174  &string(14) "obj->a.changed"
175  ["b"]=>
176  string(14) "obj->b.changed"
177}
178object(stdClass)#%d (3) {
179  ["c"]=>
180  &string(14) "obj->c.changed"
181  ["a"]=>
182  &string(14) "obj->c.changed"
183  ["b"]=>
184  string(14) "obj->b.changed"
185}
186
187
188--- b refs a:
189object(stdClass)#%d (3) {
190  ["a"]=>
191  &int(1)
192  ["b"]=>
193  &int(1)
194  ["c"]=>
195  int(1)
196}
197string(55) "O:8:"stdClass":3:{s:1:"a";i:1;s:1:"b";R:2;s:1:"c";i:1;}"
198object(stdClass)#%d (3) {
199  ["a"]=>
200  &int(1)
201  ["b"]=>
202  &int(1)
203  ["c"]=>
204  int(1)
205}
206object(stdClass)#%d (3) {
207  ["a"]=>
208  &string(14) "obj->a.changed"
209  ["b"]=>
210  &string(14) "obj->a.changed"
211  ["c"]=>
212  int(1)
213}
214object(stdClass)#%d (3) {
215  ["a"]=>
216  &string(14) "obj->b.changed"
217  ["b"]=>
218  &string(14) "obj->b.changed"
219  ["c"]=>
220  int(1)
221}
222object(stdClass)#%d (3) {
223  ["a"]=>
224  &string(14) "obj->b.changed"
225  ["b"]=>
226  &string(14) "obj->b.changed"
227  ["c"]=>
228  string(14) "obj->c.changed"
229}
230
231
232--- b refs c:
233object(stdClass)#%d (3) {
234  ["a"]=>
235  int(1)
236  ["c"]=>
237  &int(1)
238  ["b"]=>
239  &int(1)
240}
241string(55) "O:8:"stdClass":3:{s:1:"a";i:1;s:1:"c";i:1;s:1:"b";R:3;}"
242object(stdClass)#%d (3) {
243  ["a"]=>
244  int(1)
245  ["c"]=>
246  &int(1)
247  ["b"]=>
248  &int(1)
249}
250object(stdClass)#%d (3) {
251  ["a"]=>
252  string(14) "obj->a.changed"
253  ["c"]=>
254  &int(1)
255  ["b"]=>
256  &int(1)
257}
258object(stdClass)#%d (3) {
259  ["a"]=>
260  string(14) "obj->a.changed"
261  ["c"]=>
262  &string(14) "obj->b.changed"
263  ["b"]=>
264  &string(14) "obj->b.changed"
265}
266object(stdClass)#%d (3) {
267  ["a"]=>
268  string(14) "obj->a.changed"
269  ["c"]=>
270  &string(14) "obj->c.changed"
271  ["b"]=>
272  &string(14) "obj->c.changed"
273}
274
275
276--- c refs a:
277object(stdClass)#%d (3) {
278  ["a"]=>
279  &int(1)
280  ["b"]=>
281  int(1)
282  ["c"]=>
283  &int(1)
284}
285string(55) "O:8:"stdClass":3:{s:1:"a";i:1;s:1:"b";i:1;s:1:"c";R:2;}"
286object(stdClass)#%d (3) {
287  ["a"]=>
288  &int(1)
289  ["b"]=>
290  int(1)
291  ["c"]=>
292  &int(1)
293}
294object(stdClass)#%d (3) {
295  ["a"]=>
296  &string(14) "obj->a.changed"
297  ["b"]=>
298  int(1)
299  ["c"]=>
300  &string(14) "obj->a.changed"
301}
302object(stdClass)#%d (3) {
303  ["a"]=>
304  &string(14) "obj->a.changed"
305  ["b"]=>
306  string(14) "obj->b.changed"
307  ["c"]=>
308  &string(14) "obj->a.changed"
309}
310object(stdClass)#%d (3) {
311  ["a"]=>
312  &string(14) "obj->c.changed"
313  ["b"]=>
314  string(14) "obj->b.changed"
315  ["c"]=>
316  &string(14) "obj->c.changed"
317}
318
319
320--- c refs b:
321object(stdClass)#%d (3) {
322  ["a"]=>
323  int(1)
324  ["b"]=>
325  &int(1)
326  ["c"]=>
327  &int(1)
328}
329string(55) "O:8:"stdClass":3:{s:1:"a";i:1;s:1:"b";i:1;s:1:"c";R:3;}"
330object(stdClass)#%d (3) {
331  ["a"]=>
332  int(1)
333  ["b"]=>
334  &int(1)
335  ["c"]=>
336  &int(1)
337}
338object(stdClass)#%d (3) {
339  ["a"]=>
340  string(14) "obj->a.changed"
341  ["b"]=>
342  &int(1)
343  ["c"]=>
344  &int(1)
345}
346object(stdClass)#%d (3) {
347  ["a"]=>
348  string(14) "obj->a.changed"
349  ["b"]=>
350  &string(14) "obj->b.changed"
351  ["c"]=>
352  &string(14) "obj->b.changed"
353}
354object(stdClass)#%d (3) {
355  ["a"]=>
356  string(14) "obj->a.changed"
357  ["b"]=>
358  &string(14) "obj->c.changed"
359  ["c"]=>
360  &string(14) "obj->c.changed"
361}
362
363
364--- a,b refs c:
365object(stdClass)#%d (3) {
366  ["c"]=>
367  &int(1)
368  ["a"]=>
369  &int(1)
370  ["b"]=>
371  &int(1)
372}
373string(55) "O:8:"stdClass":3:{s:1:"c";i:1;s:1:"a";R:2;s:1:"b";R:2;}"
374object(stdClass)#%d (3) {
375  ["c"]=>
376  &int(1)
377  ["a"]=>
378  &int(1)
379  ["b"]=>
380  &int(1)
381}
382object(stdClass)#%d (3) {
383  ["c"]=>
384  &string(14) "obj->a.changed"
385  ["a"]=>
386  &string(14) "obj->a.changed"
387  ["b"]=>
388  &string(14) "obj->a.changed"
389}
390object(stdClass)#%d (3) {
391  ["c"]=>
392  &string(14) "obj->b.changed"
393  ["a"]=>
394  &string(14) "obj->b.changed"
395  ["b"]=>
396  &string(14) "obj->b.changed"
397}
398object(stdClass)#%d (3) {
399  ["c"]=>
400  &string(14) "obj->c.changed"
401  ["a"]=>
402  &string(14) "obj->c.changed"
403  ["b"]=>
404  &string(14) "obj->c.changed"
405}
406
407
408--- a,c refs b:
409object(stdClass)#%d (3) {
410  ["b"]=>
411  &int(1)
412  ["a"]=>
413  &int(1)
414  ["c"]=>
415  &int(1)
416}
417string(55) "O:8:"stdClass":3:{s:1:"b";i:1;s:1:"a";R:2;s:1:"c";R:2;}"
418object(stdClass)#%d (3) {
419  ["b"]=>
420  &int(1)
421  ["a"]=>
422  &int(1)
423  ["c"]=>
424  &int(1)
425}
426object(stdClass)#%d (3) {
427  ["b"]=>
428  &string(14) "obj->a.changed"
429  ["a"]=>
430  &string(14) "obj->a.changed"
431  ["c"]=>
432  &string(14) "obj->a.changed"
433}
434object(stdClass)#%d (3) {
435  ["b"]=>
436  &string(14) "obj->b.changed"
437  ["a"]=>
438  &string(14) "obj->b.changed"
439  ["c"]=>
440  &string(14) "obj->b.changed"
441}
442object(stdClass)#%d (3) {
443  ["b"]=>
444  &string(14) "obj->c.changed"
445  ["a"]=>
446  &string(14) "obj->c.changed"
447  ["c"]=>
448  &string(14) "obj->c.changed"
449}
450
451
452--- b,c refs a:
453object(stdClass)#%d (3) {
454  ["a"]=>
455  &int(1)
456  ["b"]=>
457  &int(1)
458  ["c"]=>
459  &int(1)
460}
461string(55) "O:8:"stdClass":3:{s:1:"a";i:1;s:1:"b";R:2;s:1:"c";R:2;}"
462object(stdClass)#%d (3) {
463  ["a"]=>
464  &int(1)
465  ["b"]=>
466  &int(1)
467  ["c"]=>
468  &int(1)
469}
470object(stdClass)#%d (3) {
471  ["a"]=>
472  &string(14) "obj->a.changed"
473  ["b"]=>
474  &string(14) "obj->a.changed"
475  ["c"]=>
476  &string(14) "obj->a.changed"
477}
478object(stdClass)#%d (3) {
479  ["a"]=>
480  &string(14) "obj->b.changed"
481  ["b"]=>
482  &string(14) "obj->b.changed"
483  ["c"]=>
484  &string(14) "obj->b.changed"
485}
486object(stdClass)#%d (3) {
487  ["a"]=>
488  &string(14) "obj->c.changed"
489  ["b"]=>
490  &string(14) "obj->c.changed"
491  ["c"]=>
492  &string(14) "obj->c.changed"
493}
494Done