diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index 6b2449d99551..3d4542a964d3 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -326,14 +326,23 @@ protected function checkListenerExpectedEvent($target, Event $event) return $event; } - $typehint = $reflected->getClass(); + $expected = null; + $isClass = false; + if (\PHP_VERSION_ID >= 70000) { + $reflectionType = $reflected->getType(); + if ($reflectionType) { + $expected = $reflectionType instanceof \ReflectionNamedType ? $reflectionType->getName() : (string)$reflectionType; + $isClass = !$reflectionType->isBuiltin(); + } + } else { + $expected = $reflected->getClass() ? $reflected->getClass()->getName() : null; + $isClass = null !== $expected; + } - if (!$typehint instanceof \ReflectionClass) { + if (!$isClass) { return $event; } - $expected = $typehint->getName(); - // BC support if (!$event instanceof $expected && $expected === 'Composer\Script\CommandEvent') { trigger_error('The callback '.$this->serializeCallback($target).' declared at '.$reflected->getDeclaringFunction()->getFileName().' accepts a '.$expected.' but '.$event->getName().' events use a '.get_class($event).' instance. Please adjust your type hint accordingly, see https://getcomposer.org/doc/articles/scripts.md#event-classes', E_USER_DEPRECATED); diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index 87b82d14d720..a724f644fcd5 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -127,8 +127,20 @@ public function createRepository($type, $config, $name = null) $reflMethod = new \ReflectionMethod($class, '__construct'); $params = $reflMethod->getParameters(); - if (isset($params[4]) && $params[4]->getClass() && $params[4]->getClass()->getName() === 'Composer\Util\RemoteFilesystem') { - return new $class($config, $this->io, $this->config, $this->eventDispatcher, $this->rfs); + if (isset($params[4])) { + $paramType = null; + if (\PHP_VERSION_ID >= 70000) { + $reflectionType = $params[4]->getType(); + if ($reflectionType) { + $paramType = $reflectionType instanceof \ReflectionNamedType ? $reflectionType->getName() : (string)$reflectionType; + } + } else { + $paramType = $params[4]->getClass() ? $params[4]->getClass()->getName() : null; + } + + if ($paramType === 'Composer\Util\RemoteFilesystem') { + return new $class($config, $this->io, $this->config, $this->eventDispatcher, $this->rfs); + } } return new $class($config, $this->io, $this->config, $this->eventDispatcher);