arrayObject_magicMethods2.phpt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. --TEST--
  2. SPL: ArrayObject: ensure a wrapped object's magic methods for property access are not invoked when manipulating the ArrayObject's elements using ->.
  3. --FILE--
  4. <?php
  5. class UsesMagic {
  6. public $a = 1;
  7. public $b = 2;
  8. public $c = 3;
  9. private $priv = 'secret';
  10. function __get($name) {
  11. $args = func_get_args();
  12. echo "In " . __METHOD__ . "(" . implode($args, ',') . ")\n";
  13. }
  14. function __set($name, $value) {
  15. $args = func_get_args();
  16. echo "In " . __METHOD__ . "(" . implode($args, ',') . ")\n";
  17. }
  18. function __isset($name) {
  19. $args = func_get_args();
  20. echo "In " . __METHOD__ . "(" . implode($args, ',') . ")\n";
  21. }
  22. function __unset($name) {
  23. $args = func_get_args();
  24. echo "In " . __METHOD__ . "(" . implode($args, ',') . ")\n";
  25. }
  26. }
  27. $obj = new UsesMagic;
  28. $ao = new ArrayObject($obj);
  29. echo "\n--> Write existent, non-existent and dynamic:\n";
  30. $ao->a = 'changed';
  31. $ao->dynamic = 'new';
  32. $ao->dynamic = 'new.changed';
  33. echo " Original wrapped object:\n";
  34. var_dump($obj);
  35. echo " Wrapping ArrayObject:\n";
  36. var_dump($ao);
  37. echo "\n--> Read existent, non-existent and dynamic:\n";
  38. var_dump($ao->a);
  39. var_dump($ao->nonexistent);
  40. var_dump($ao->dynamic);
  41. echo " Original wrapped object:\n";
  42. var_dump($obj);
  43. echo " Wrapping ArrayObject:\n";
  44. var_dump($ao);
  45. echo "\n--> isset existent, non-existent and dynamic:\n";
  46. var_dump(isset($ao->a));
  47. var_dump(isset($ao->nonexistent));
  48. var_dump(isset($ao->dynamic));
  49. echo " Original wrapped object:\n";
  50. var_dump($obj);
  51. echo " Wrapping ArrayObject:\n";
  52. var_dump($ao);
  53. echo "\n--> Unset existent, non-existent and dynamic:\n";
  54. unset($ao->a);
  55. unset($ao->nonexistent);
  56. unset($ao->dynamic);
  57. echo " Original wrapped object:\n";
  58. var_dump($obj);
  59. echo " Wrapping ArrayObject:\n";
  60. var_dump($ao);
  61. ?>
  62. --EXPECTF--
  63. --> Write existent, non-existent and dynamic:
  64. Original wrapped object:
  65. object(UsesMagic)#1 (4) {
  66. ["a"]=>
  67. int(1)
  68. ["b"]=>
  69. int(2)
  70. ["c"]=>
  71. int(3)
  72. ["priv":"UsesMagic":private]=>
  73. string(6) "secret"
  74. }
  75. Wrapping ArrayObject:
  76. object(ArrayObject)#2 (3) {
  77. ["a"]=>
  78. string(7) "changed"
  79. ["dynamic"]=>
  80. string(11) "new.changed"
  81. ["storage":"ArrayObject":private]=>
  82. object(UsesMagic)#1 (4) {
  83. ["a"]=>
  84. int(1)
  85. ["b"]=>
  86. int(2)
  87. ["c"]=>
  88. int(3)
  89. ["priv":"UsesMagic":private]=>
  90. string(6) "secret"
  91. }
  92. }
  93. --> Read existent, non-existent and dynamic:
  94. string(7) "changed"
  95. Warning: Undefined property: ArrayObject::$nonexistent in %s on line %d
  96. NULL
  97. string(11) "new.changed"
  98. Original wrapped object:
  99. object(UsesMagic)#1 (4) {
  100. ["a"]=>
  101. int(1)
  102. ["b"]=>
  103. int(2)
  104. ["c"]=>
  105. int(3)
  106. ["priv":"UsesMagic":private]=>
  107. string(6) "secret"
  108. }
  109. Wrapping ArrayObject:
  110. object(ArrayObject)#2 (3) {
  111. ["a"]=>
  112. string(7) "changed"
  113. ["dynamic"]=>
  114. string(11) "new.changed"
  115. ["storage":"ArrayObject":private]=>
  116. object(UsesMagic)#1 (4) {
  117. ["a"]=>
  118. int(1)
  119. ["b"]=>
  120. int(2)
  121. ["c"]=>
  122. int(3)
  123. ["priv":"UsesMagic":private]=>
  124. string(6) "secret"
  125. }
  126. }
  127. --> isset existent, non-existent and dynamic:
  128. bool(true)
  129. bool(false)
  130. bool(true)
  131. Original wrapped object:
  132. object(UsesMagic)#1 (4) {
  133. ["a"]=>
  134. int(1)
  135. ["b"]=>
  136. int(2)
  137. ["c"]=>
  138. int(3)
  139. ["priv":"UsesMagic":private]=>
  140. string(6) "secret"
  141. }
  142. Wrapping ArrayObject:
  143. object(ArrayObject)#2 (3) {
  144. ["a"]=>
  145. string(7) "changed"
  146. ["dynamic"]=>
  147. string(11) "new.changed"
  148. ["storage":"ArrayObject":private]=>
  149. object(UsesMagic)#1 (4) {
  150. ["a"]=>
  151. int(1)
  152. ["b"]=>
  153. int(2)
  154. ["c"]=>
  155. int(3)
  156. ["priv":"UsesMagic":private]=>
  157. string(6) "secret"
  158. }
  159. }
  160. --> Unset existent, non-existent and dynamic:
  161. Original wrapped object:
  162. object(UsesMagic)#1 (4) {
  163. ["a"]=>
  164. int(1)
  165. ["b"]=>
  166. int(2)
  167. ["c"]=>
  168. int(3)
  169. ["priv":"UsesMagic":private]=>
  170. string(6) "secret"
  171. }
  172. Wrapping ArrayObject:
  173. object(ArrayObject)#2 (1) {
  174. ["storage":"ArrayObject":private]=>
  175. object(UsesMagic)#1 (4) {
  176. ["a"]=>
  177. int(1)
  178. ["b"]=>
  179. int(2)
  180. ["c"]=>
  181. int(3)
  182. ["priv":"UsesMagic":private]=>
  183. string(6) "secret"
  184. }
  185. }