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