-
-
Notifications
You must be signed in to change notification settings - Fork 205
Open
Description
Related to #1589
Analysis
Recap of existing PHP 8.2 behavior based on the RFC:
class ReflectionMethod
{
// Signature 1: called with exactly 2 arguments.
public function __construct(object|string $objectOrClass, string $method) {}
// Signature 2: called with exactly 1 argument.
public function __construct(string $classMethod) {}
}Updated behavior for each version:
class ReflectionMethod
{
// Signature 1: unchanged behavior
public function __construct(object|string $objectOrClass, string $method) {}
// Signature 2: deprecated in 8.4, removed in a future (TBD) major version.
public function __construct(string $classMethod) {}
// Named constructor: replaces signature 2, added in PHP 8.3
public static function createFromMethodName(string $method): static {}
}Top 2000
Found several uses of the deprecated constructor. Examples:
dedoc/scramble:
$reflection = new ReflectionMethod(...explode('@', $route->getAction('uses')));roave/better-reflection:
return new ReflectionMethod($this->betterReflectionObject->getConstructor());Detection in PHP 8.2
ReflectionMethod::createFromMethodNameis invalid.- Any form of
new ReflectionMethod(...)is unchanged and out of scope for this version, see "Syntax Variations" below.
Detection in PHP 8.3
ReflectionMethod::createFromMethodNameis valid.- Any form of
new ReflectionMethod(...)is unchanged and out of scope for this version, see "Syntax Variations" below.
Detection in PHP 8.4
new ReflectionMethod(...)with 1 argument is deprecated, add warning. See "Syntax Variations" below.
Syntax Variations
ReflectionMethod::createFromMethodName✅ Can be handled by PHPCompatibility.new ReflectionMethod(...)✅ Can be handled by PHPCompatibility.$className = 'ReflectionMethod'; new $className();❌ Unreliable, as $className could be defined anywhere.new SomeClassWhichExtendsReflectionMethod(...)❌ Can't be handled.class Foo extends ReflectionMethod { ... parent::__construct(...) ... }✅ Should be doable.
3v4l.org
- ReflectionMethod::createFromMethodName - named constructor forbidden in PHP <=8.2
- ReflectionMethod::__construct - signature 2 deprecated in PHP >=8.4
- Child of ReflectionMethod - parent::__construct - check 1st level of inheritance, 2nd level is out of scope