diff --git a/src/Type/ObjectType.php b/src/Type/ObjectType.php index 3e755bab60..85fcc4bf05 100644 --- a/src/Type/ObjectType.php +++ b/src/Type/ObjectType.php @@ -1735,21 +1735,20 @@ public function getNakedClassReflection(): ?ClassReflection public function getClassReflection(): ?ClassReflection { - if ($this->classReflection !== null) { - return $this->classReflection; - } + if ($this->classReflection === null) { + $reflectionProvider = ReflectionProviderStaticAccessor::getInstance(); + if (!$reflectionProvider->hasClass($this->className)) { + return null; + } - $reflectionProvider = ReflectionProviderStaticAccessor::getInstance(); - if (!$reflectionProvider->hasClass($this->className)) { - return null; + $this->classReflection = $reflectionProvider->getClass($this->className); } - $classReflection = $reflectionProvider->getClass($this->className); - if ($classReflection->isGeneric()) { - return $this->classReflection = $classReflection->withTypes(array_values($classReflection->getTemplateTypeMap()->map(static fn (): Type => new ErrorType())->getTypes())); + if ($this->classReflection->isGeneric()) { + return $this->classReflection->withTypes(array_values($this->classReflection->getTemplateTypeMap()->map(static fn (): Type => new ErrorType())->getTypes())); } - return $this->classReflection = $classReflection; + return $this->classReflection; } public function getAncestorWithClassName(string $className): ?self diff --git a/tests/PHPStan/Analyser/nsrt/bug-13985.php b/tests/PHPStan/Analyser/nsrt/bug-13985.php new file mode 100644 index 0000000000..0224007d36 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-13985.php @@ -0,0 +1,32 @@ + $value) { + assertType('int', $key); + assertType('object', $value); + } + } +} + +class X {} + +/** + * @param SplObjectStorage $splObjectStorage + * @return void + */ +function genericExample(SplObjectStorage $splObjectStorage): void +{ + foreach ($splObjectStorage as $key => $value) { + assertType('int', $key); + assertType('Bug13985\X', $value); + } + assertType('int', $splObjectStorage->getInfo()); + +} diff --git a/tests/PHPStan/Analyser/nsrt/bug-4789.php b/tests/PHPStan/Analyser/nsrt/bug-4789.php new file mode 100644 index 0000000000..4f47b1859d --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-4789.php @@ -0,0 +1,11 @@ += 8.0 + +namespace Bug4789; + +use function PHPStan\Testing\assertType; + +function doFoo(\DatePeriod $p) { + foreach ($p as $dt) { + assertType('DateTimeInterface', $dt); + } +}