Hello list,
this proposal will be useful in combination with "Declaration-aware attributes"
Problem
========
Currently, ReflectionMethod is not aware of the original class, if the
method is declared in a parent class.
Methods that are called during a discovery algorithm that need to
process a method with its original class typically need two
parameters:
function processMethod(\ReflectionClass $class, \ReflectionMethod $method) {..}
Proposal
========
Let a ReflectionMethod object keep track of the original class.
Introduce a new method ReflectionMethod->getOriginalClass() to retrieve it.
class B {
function f($x) {}
}
class C extends B {}
foreach ([
// There are different ways to get a reflection method object, all
of them track the original class.
new ReflectionMethod('C', 'f'),
(new ReflectionClass('C'))->getMethod('f'),
(new ReflectionMethod('C', 'f'))->getParameters()[0]->getDeclaringFunction(),
] as $rm) {
// The following won't change:
assert($rm->class === 'B');
assert($rm->getDeclaringClass()->getName() === 'B');
// New method:
assert($rm->getOriginalClass()->getName() === 'C');
Alternatives
==========
At first I thought we might introduce a new class like
"VirtualReflectionMethod" which behaves as if the method was declared
on the child class. But this is awkward.
I think the ->getOriginalClass() is much simpler.
--- Andreas
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php