serialization_objects_013.phpt 7.8 KB

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