arrayObject_magicMethods3.phpt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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 -> and ArrayObject::ARRAY_AS_PROPS.
  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, ArrayObject::ARRAY_AS_PROPS);
  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 (5) {
  66. ["a"]=>
  67. string(7) "changed"
  68. ["b"]=>
  69. int(2)
  70. ["c"]=>
  71. int(3)
  72. ["priv":"UsesMagic":private]=>
  73. string(6) "secret"
  74. ["dynamic"]=>
  75. string(11) "new.changed"
  76. }
  77. Wrapping ArrayObject:
  78. object(ArrayObject)#2 (1) {
  79. ["storage":"ArrayObject":private]=>
  80. object(UsesMagic)#1 (5) {
  81. ["a"]=>
  82. string(7) "changed"
  83. ["b"]=>
  84. int(2)
  85. ["c"]=>
  86. int(3)
  87. ["priv":"UsesMagic":private]=>
  88. string(6) "secret"
  89. ["dynamic"]=>
  90. string(11) "new.changed"
  91. }
  92. }
  93. --> Read existent, non-existent and dynamic:
  94. string(7) "changed"
  95. Warning: Undefined array key "nonexistent" in %s on line %d
  96. NULL
  97. string(11) "new.changed"
  98. Original wrapped object:
  99. object(UsesMagic)#1 (5) {
  100. ["a"]=>
  101. string(7) "changed"
  102. ["b"]=>
  103. int(2)
  104. ["c"]=>
  105. int(3)
  106. ["priv":"UsesMagic":private]=>
  107. string(6) "secret"
  108. ["dynamic"]=>
  109. string(11) "new.changed"
  110. }
  111. Wrapping ArrayObject:
  112. object(ArrayObject)#2 (1) {
  113. ["storage":"ArrayObject":private]=>
  114. object(UsesMagic)#1 (5) {
  115. ["a"]=>
  116. string(7) "changed"
  117. ["b"]=>
  118. int(2)
  119. ["c"]=>
  120. int(3)
  121. ["priv":"UsesMagic":private]=>
  122. string(6) "secret"
  123. ["dynamic"]=>
  124. string(11) "new.changed"
  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 (5) {
  133. ["a"]=>
  134. string(7) "changed"
  135. ["b"]=>
  136. int(2)
  137. ["c"]=>
  138. int(3)
  139. ["priv":"UsesMagic":private]=>
  140. string(6) "secret"
  141. ["dynamic"]=>
  142. string(11) "new.changed"
  143. }
  144. Wrapping ArrayObject:
  145. object(ArrayObject)#2 (1) {
  146. ["storage":"ArrayObject":private]=>
  147. object(UsesMagic)#1 (5) {
  148. ["a"]=>
  149. string(7) "changed"
  150. ["b"]=>
  151. int(2)
  152. ["c"]=>
  153. int(3)
  154. ["priv":"UsesMagic":private]=>
  155. string(6) "secret"
  156. ["dynamic"]=>
  157. string(11) "new.changed"
  158. }
  159. }
  160. --> Unset existent, non-existent and dynamic:
  161. Original wrapped object:
  162. object(UsesMagic)#1 (3) {
  163. ["b"]=>
  164. int(2)
  165. ["c"]=>
  166. int(3)
  167. ["priv":"UsesMagic":private]=>
  168. string(6) "secret"
  169. }
  170. Wrapping ArrayObject:
  171. object(ArrayObject)#2 (1) {
  172. ["storage":"ArrayObject":private]=>
  173. object(UsesMagic)#1 (3) {
  174. ["b"]=>
  175. int(2)
  176. ["c"]=>
  177. int(3)
  178. ["priv":"UsesMagic":private]=>
  179. string(6) "secret"
  180. }
  181. }