PHPCompatibility
PHPCompatibility copied to clipboard
PHP 8.3: ReflectionMethod::__construct() replacement
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
References
Same remarks apply as I left in my comment in #1977.
@jrfnl Found constructor uses with one argument in Top 2000 Packages. Documented sniffability limitations in Syntax Variations. Most real-world uses seems to be new ReflectionMethod, which we're well-equipped to sniff.