serialization_objects_013.phpt 7.9 KB

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