@@ -9,18 +9,37 @@ class B extends A {
99 public $ a ;
1010 protected $ b ;
1111 private $ c ;
12- public protected(set) int $ d ;
12+ public protected(set) int $ d = 42 ;
1313 public $ e { get => 42 ; }
1414 public $ f { set {} }
15+ public int $ g ;
16+ public int $ h = 42 ;
17+ public int $ i ;
18+ public int $ j ;
19+
20+ public function __construct () {
21+ unset($ this ->i );
22+ unset($ this ->j );
23+ }
24+
25+ public function __isset ($ name ) {
26+ return $ name === 'i ' ;
27+ }
28+
29+ public function __get ($ name ) {}
1530}
1631
17- class C extends B {}
32+ class C extends B {
33+ public function __get ($ name ) {}
34+ }
1835
1936$ test = static function ($ scope ) {
2037 $ rc = new ReflectionClass (B::class);
2138 foreach ($ rc ->getProperties () as $ rp ) {
2239 echo $ rp ->getName () . ' from ' . ($ scope ?? 'global ' ) . ': ' ;
2340 var_dump ($ rp ->isReadable (null , $ scope ));
41+ echo $ rp ->getName () . ' from ' . ($ scope ?? 'global ' ) . ' (instance): ' ;
42+ var_dump ($ rp ->isReadable (new B (), $ scope ));
2443 }
2544};
2645
@@ -32,53 +51,189 @@ foreach (['A', 'B', 'C'] as $scope) {
3251$ test (null );
3352$ test ->bindTo (null , null )('static ' );
3453
54+ $ rp = new ReflectionProperty ('B ' , 'a ' );
55+ $ b = new B ();
56+ echo $ rp ->getName () . ' from global (uninitialized): ' ;
57+ var_dump ($ rp ->isReadable ($ b ));
58+ $ b ->a = 42 ;
59+ echo $ rp ->getName () . ' from global (initialized): ' ;
60+ var_dump ($ rp ->isReadable ($ b ));
61+ unset($ b ->a );
62+ echo $ rp ->getName () . ' from global (unset): ' ;
63+ var_dump ($ rp ->isReadable ($ b ));
64+
65+ $ rp = new ReflectionProperty ('C ' , 'a ' );
66+ $ c = new C ();
67+ echo $ rp ->getName () . ' from global (uninitialized): ' ;
68+ var_dump ($ rp ->isReadable ($ c ));
69+ unset($ c ->a );
70+ echo $ rp ->getName () . ' from global (unset): ' ;
71+ var_dump ($ rp ->isReadable ($ c ));
72+
3573?>
3674--EXPECT--
3775a from A: bool(true)
76+ a from A (instance): bool(true)
3877b from A: bool(true)
78+ b from A (instance): bool(true)
3979c from A: bool(false)
80+ c from A (instance): bool(false)
4081d from A: bool(true)
82+ d from A (instance): bool(false)
4183e from A: bool(true)
84+ e from A (instance): bool(true)
4285f from A: bool(false)
86+ f from A (instance): bool(false)
87+ g from A: bool(true)
88+ g from A (instance): bool(false)
89+ h from A: bool(true)
90+ h from A (instance): bool(true)
91+ i from A: bool(true)
92+ i from A (instance): bool(true)
93+ j from A: bool(true)
94+ j from A (instance): bool(true)
4395a from static: bool(true)
96+ a from static (instance): bool(true)
4497b from static: bool(true)
98+ b from static (instance): bool(true)
4599c from static: bool(false)
100+ c from static (instance): bool(false)
46101d from static: bool(true)
102+ d from static (instance): bool(false)
47103e from static: bool(true)
104+ e from static (instance): bool(true)
48105f from static: bool(false)
106+ f from static (instance): bool(false)
107+ g from static: bool(true)
108+ g from static (instance): bool(false)
109+ h from static: bool(true)
110+ h from static (instance): bool(true)
111+ i from static: bool(true)
112+ i from static (instance): bool(true)
113+ j from static: bool(true)
114+ j from static (instance): bool(true)
49115a from B: bool(true)
116+ a from B (instance): bool(true)
50117b from B: bool(true)
118+ b from B (instance): bool(true)
51119c from B: bool(true)
120+ c from B (instance): bool(true)
52121d from B: bool(true)
122+ d from B (instance): bool(false)
53123e from B: bool(true)
124+ e from B (instance): bool(true)
54125f from B: bool(false)
126+ f from B (instance): bool(false)
127+ g from B: bool(true)
128+ g from B (instance): bool(false)
129+ h from B: bool(true)
130+ h from B (instance): bool(true)
131+ i from B: bool(true)
132+ i from B (instance): bool(true)
133+ j from B: bool(true)
134+ j from B (instance): bool(true)
55135a from static: bool(true)
136+ a from static (instance): bool(true)
56137b from static: bool(true)
138+ b from static (instance): bool(true)
57139c from static: bool(true)
140+ c from static (instance): bool(true)
58141d from static: bool(true)
142+ d from static (instance): bool(false)
59143e from static: bool(true)
144+ e from static (instance): bool(true)
60145f from static: bool(false)
146+ f from static (instance): bool(false)
147+ g from static: bool(true)
148+ g from static (instance): bool(false)
149+ h from static: bool(true)
150+ h from static (instance): bool(true)
151+ i from static: bool(true)
152+ i from static (instance): bool(true)
153+ j from static: bool(true)
154+ j from static (instance): bool(true)
61155a from C: bool(true)
156+ a from C (instance): bool(true)
62157b from C: bool(true)
158+ b from C (instance): bool(true)
63159c from C: bool(false)
160+ c from C (instance): bool(false)
64161d from C: bool(true)
162+ d from C (instance): bool(false)
65163e from C: bool(true)
164+ e from C (instance): bool(true)
66165f from C: bool(false)
166+ f from C (instance): bool(false)
167+ g from C: bool(true)
168+ g from C (instance): bool(false)
169+ h from C: bool(true)
170+ h from C (instance): bool(true)
171+ i from C: bool(true)
172+ i from C (instance): bool(true)
173+ j from C: bool(true)
174+ j from C (instance): bool(true)
67175a from static: bool(true)
176+ a from static (instance): bool(true)
68177b from static: bool(true)
178+ b from static (instance): bool(true)
69179c from static: bool(false)
180+ c from static (instance): bool(false)
70181d from static: bool(true)
182+ d from static (instance): bool(false)
71183e from static: bool(true)
184+ e from static (instance): bool(true)
72185f from static: bool(false)
186+ f from static (instance): bool(false)
187+ g from static: bool(true)
188+ g from static (instance): bool(false)
189+ h from static: bool(true)
190+ h from static (instance): bool(true)
191+ i from static: bool(true)
192+ i from static (instance): bool(true)
193+ j from static: bool(true)
194+ j from static (instance): bool(true)
73195a from global: bool(true)
196+ a from global (instance): bool(true)
74197b from global: bool(false)
198+ b from global (instance): bool(false)
75199c from global: bool(false)
200+ c from global (instance): bool(false)
76201d from global: bool(true)
202+ d from global (instance): bool(false)
77203e from global: bool(true)
204+ e from global (instance): bool(true)
78205f from global: bool(false)
206+ f from global (instance): bool(false)
207+ g from global: bool(true)
208+ g from global (instance): bool(false)
209+ h from global: bool(true)
210+ h from global (instance): bool(true)
211+ i from global: bool(true)
212+ i from global (instance): bool(true)
213+ j from global: bool(true)
214+ j from global (instance): bool(true)
79215a from static: bool(true)
216+ a from static (instance): bool(true)
80217b from static: bool(false)
218+ b from static (instance): bool(false)
81219c from static: bool(false)
220+ c from static (instance): bool(false)
82221d from static: bool(true)
222+ d from static (instance): bool(false)
83223e from static: bool(true)
224+ e from static (instance): bool(true)
84225f from static: bool(false)
226+ f from static (instance): bool(false)
227+ g from static: bool(true)
228+ g from static (instance): bool(false)
229+ h from static: bool(true)
230+ h from static (instance): bool(true)
231+ i from static: bool(true)
232+ i from static (instance): bool(true)
233+ j from static: bool(true)
234+ j from static (instance): bool(true)
235+ a from global (uninitialized): bool(true)
236+ a from global (initialized): bool(true)
237+ a from global (unset): bool(true)
238+ a from global (uninitialized): bool(true)
239+ a from global (unset): bool(true)
0 commit comments