arrayObject_magicMethods5.phpt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. --TEST--
  2. SPL: ArrayObject: ensure the magic methods for property access of a subclass of ArrayObject ARE invoked when manipulating its elements using ->.
  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 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);
  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. --EXPECT--
  66. --> Write existent, non-existent and dynamic:
  67. In UsesMagic::__set(a,changed)
  68. In UsesMagic::__set(dynamic,new)
  69. In UsesMagic::__set(dynamic,new.changed)
  70. Original wrapped object:
  71. object(C)#1 (4) {
  72. ["a"]=>
  73. int(1)
  74. ["b"]=>
  75. int(2)
  76. ["c"]=>
  77. int(3)
  78. ["priv":"C":private]=>
  79. string(6) "secret"
  80. }
  81. Wrapping ArrayObject:
  82. object(UsesMagic)#2 (2) {
  83. ["b"]=>
  84. string(29) "This should appear in storage"
  85. ["storage":"ArrayObject":private]=>
  86. object(C)#1 (4) {
  87. ["a"]=>
  88. int(1)
  89. ["b"]=>
  90. int(2)
  91. ["c"]=>
  92. int(3)
  93. ["priv":"C":private]=>
  94. string(6) "secret"
  95. }
  96. }
  97. --> Read existent, non-existent and dynamic:
  98. In UsesMagic::__get(a)
  99. NULL
  100. In UsesMagic::__get(nonexistent)
  101. NULL
  102. In UsesMagic::__get(dynamic)
  103. NULL
  104. Original wrapped object:
  105. object(C)#1 (4) {
  106. ["a"]=>
  107. int(1)
  108. ["b"]=>
  109. int(2)
  110. ["c"]=>
  111. int(3)
  112. ["priv":"C":private]=>
  113. string(6) "secret"
  114. }
  115. Wrapping ArrayObject:
  116. object(UsesMagic)#2 (2) {
  117. ["b"]=>
  118. string(29) "This should appear in storage"
  119. ["storage":"ArrayObject":private]=>
  120. object(C)#1 (4) {
  121. ["a"]=>
  122. int(1)
  123. ["b"]=>
  124. int(2)
  125. ["c"]=>
  126. int(3)
  127. ["priv":"C":private]=>
  128. string(6) "secret"
  129. }
  130. }
  131. --> isset existent, non-existent and dynamic:
  132. In UsesMagic::__isset(a)
  133. bool(false)
  134. In UsesMagic::__isset(nonexistent)
  135. bool(false)
  136. In UsesMagic::__isset(dynamic)
  137. bool(false)
  138. Original wrapped object:
  139. object(C)#1 (4) {
  140. ["a"]=>
  141. int(1)
  142. ["b"]=>
  143. int(2)
  144. ["c"]=>
  145. int(3)
  146. ["priv":"C":private]=>
  147. string(6) "secret"
  148. }
  149. Wrapping ArrayObject:
  150. object(UsesMagic)#2 (2) {
  151. ["b"]=>
  152. string(29) "This should appear in storage"
  153. ["storage":"ArrayObject":private]=>
  154. object(C)#1 (4) {
  155. ["a"]=>
  156. int(1)
  157. ["b"]=>
  158. int(2)
  159. ["c"]=>
  160. int(3)
  161. ["priv":"C":private]=>
  162. string(6) "secret"
  163. }
  164. }
  165. --> Unset existent, non-existent and dynamic:
  166. In UsesMagic::__unset(a)
  167. In UsesMagic::__unset(nonexistent)
  168. In UsesMagic::__unset(dynamic)
  169. Original wrapped object:
  170. object(C)#1 (4) {
  171. ["a"]=>
  172. int(1)
  173. ["b"]=>
  174. int(2)
  175. ["c"]=>
  176. int(3)
  177. ["priv":"C":private]=>
  178. string(6) "secret"
  179. }
  180. Wrapping ArrayObject:
  181. object(UsesMagic)#2 (2) {
  182. ["b"]=>
  183. string(29) "This should appear in storage"
  184. ["storage":"ArrayObject":private]=>
  185. object(C)#1 (4) {
  186. ["a"]=>
  187. int(1)
  188. ["b"]=>
  189. int(2)
  190. ["c"]=>
  191. int(3)
  192. ["priv":"C":private]=>
  193. string(6) "secret"
  194. }
  195. }