@@ -139,6 +139,18 @@ public function getProperties($class, array $context = []): ?array
139
139
*/
140
140
public function getTypes ($ class , $ property , array $ context = []): ?array
141
141
{
142
+ if (\PHP_VERSION_ID >= 70400 ) {
143
+ try {
144
+ $ reflectionProperty = new \ReflectionProperty ($ class , $ property );
145
+ $ type = $ reflectionProperty ->getType ();
146
+ if (null !== $ type ) {
147
+ return $ this ->extractFromReflectionType ($ type , $ reflectionProperty ->getDeclaringClass ());
148
+ }
149
+ } catch (\ReflectionException $ e ) {
150
+ // noop
151
+ }
152
+ }
153
+
142
154
if ($ fromMutator = $ this ->extractFromMutator ($ class , $ property )) {
143
155
return $ fromMutator ;
144
156
}
@@ -233,7 +245,7 @@ private function extractFromMutator(string $class, string $property): ?array
233
245
if (!$ reflectionType = $ reflectionParameter ->getType ()) {
234
246
return null ;
235
247
}
236
- $ type = $ this ->extractFromReflectionType ($ reflectionType , $ reflectionMethod );
248
+ $ type = $ this ->extractFromReflectionType ($ reflectionType , $ reflectionMethod-> getDeclaringClass () );
237
249
238
250
if (1 === \count ($ type ) && \in_array ($ prefix , $ this ->arrayMutatorPrefixes )) {
239
251
$ type = [new Type (Type::BUILTIN_TYPE_ARRAY , false , null , true , new Type (Type::BUILTIN_TYPE_INT ), $ type [0 ])];
@@ -255,7 +267,7 @@ private function extractFromAccessor(string $class, string $property): ?array
255
267
}
256
268
257
269
if ($ reflectionType = $ reflectionMethod ->getReturnType ()) {
258
- return $ this ->extractFromReflectionType ($ reflectionType , $ reflectionMethod );
270
+ return $ this ->extractFromReflectionType ($ reflectionType , $ reflectionMethod-> getDeclaringClass () );
259
271
}
260
272
261
273
if (\in_array ($ prefix , ['is ' , 'can ' , 'has ' ])) {
@@ -290,7 +302,7 @@ private function extractFromConstructor(string $class, string $property): ?array
290
302
}
291
303
$ reflectionType = $ parameter ->getType ();
292
304
293
- return $ reflectionType ? $ this ->extractFromReflectionType ($ reflectionType , $ constructor ) : null ;
305
+ return $ reflectionType ? $ this ->extractFromReflectionType ($ reflectionType , $ constructor-> getDeclaringClass () ) : null ;
294
306
}
295
307
296
308
if ($ parentClass = $ reflectionClass ->getParentClass ()) {
@@ -319,7 +331,7 @@ private function extractFromDefaultValue(string $class, string $property): ?arra
319
331
return [new Type (static ::MAP_TYPES [$ type ] ?? $ type )];
320
332
}
321
333
322
- private function extractFromReflectionType (\ReflectionType $ reflectionType , \ReflectionMethod $ reflectionMethod ): array
334
+ private function extractFromReflectionType (\ReflectionType $ reflectionType , \ReflectionClass $ declaringClass ): array
323
335
{
324
336
$ types = [];
325
337
$ nullable = $ reflectionType ->allowsNull ();
@@ -337,19 +349,19 @@ private function extractFromReflectionType(\ReflectionType $reflectionType, \Ref
337
349
} elseif ($ type ->isBuiltin ()) {
338
350
$ types [] = new Type ($ phpTypeOrClass , $ nullable );
339
351
} else {
340
- $ types [] = new Type (Type::BUILTIN_TYPE_OBJECT , $ nullable , $ this ->resolveTypeName ($ phpTypeOrClass , $ reflectionMethod ));
352
+ $ types [] = new Type (Type::BUILTIN_TYPE_OBJECT , $ nullable , $ this ->resolveTypeName ($ phpTypeOrClass , $ declaringClass ));
341
353
}
342
354
}
343
355
344
356
return $ types ;
345
357
}
346
358
347
- private function resolveTypeName (string $ name , \ReflectionMethod $ reflectionMethod ): string
359
+ private function resolveTypeName (string $ name , \ReflectionClass $ declaringClass ): string
348
360
{
349
361
if ('self ' === $ lcName = strtolower ($ name )) {
350
- return $ reflectionMethod -> getDeclaringClass () ->name ;
362
+ return $ declaringClass ->name ;
351
363
}
352
- if ('parent ' === $ lcName && $ parent = $ reflectionMethod -> getDeclaringClass () ->getParentClass ()) {
364
+ if ('parent ' === $ lcName && $ parent = $ declaringClass ->getParentClass ()) {
353
365
return $ parent ->name ;
354
366
}
355
367
0 commit comments