Browse Source

fix deprecations in PHP 8

azjezz 4 years ago
parent
commit
30f994e424

+ 13 - 4
src/Composer/EventDispatcher/EventDispatcher.php

@@ -326,14 +326,23 @@ class EventDispatcher
             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);

+ 14 - 2
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);