diff --git a/src/Reflection/ReflectionClass.php b/src/Reflection/ReflectionClass.php index 3564c4b5d..b6fbcefad 100644 --- a/src/Reflection/ReflectionClass.php +++ b/src/Reflection/ReflectionClass.php @@ -909,7 +909,11 @@ private function reflectClassForNamedNode(Node\Name $node) : self { // @TODO use actual `ClassReflector` or `FunctionReflector`? /** @var self $class */ - $class = $this->reflector->reflect($node->toString()); + if ($this->isAnonymous()) { + $class = (new BetterReflection())->classReflector()->reflect($node->toString()); + } else { + $class = $this->reflector->reflect($node->toString()); + } return $class; } diff --git a/test/unit/Fixture/AnonymousClassInstanceWithInterface.php b/test/unit/Fixture/AnonymousClassInstanceWithInterface.php new file mode 100644 index 000000000..962cda19d --- /dev/null +++ b/test/unit/Fixture/AnonymousClassInstanceWithInterface.php @@ -0,0 +1,12 @@ +getEndLine()); } + public function testReflectionForAnonymousClassWithInterface() : void + { + $file = FileHelper::normalizeWindowsPath(realpath(__DIR__ . '/../Fixture/AnonymousClassInstanceWithInterface.php')); + + $anonymousClass = require $file; + + $classInfo = ReflectionObject::createFromInstance($anonymousClass); + + self::assertTrue($classInfo->isAnonymous()); + self::assertFalse($classInfo->inNamespace()); + self::assertStringStartsWith(ReflectionClass::ANONYMOUS_CLASS_NAME_PREFIX, $classInfo->getName()); + self::assertContains(\FixtureInterface::class, $classInfo->getInterfaceNames()); + self::assertTrue($classInfo->isInstantiable()); + } + public function testReflectionWorksWithInternalClasses() : void { $foo = new stdClass();