diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index 6b2449d99..3d4542a96 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -326,13 +326,22 @@ class EventDispatcher return $event; } - $typehint = $reflected->getClass(); - - if (!$typehint instanceof \ReflectionClass) { - return $event; + $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; } - $expected = $typehint->getName(); + if (!$isClass) { + return $event; + } // BC support if (!$event instanceof $expected && $expected === 'Composer\Script\CommandEvent') { diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index 87b82d14d..a724f644f 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -127,8 +127,20 @@ class RepositoryManager $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);