arrayObject_magicMethods6.phpt 4.3 KB

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