--
Larry Garfield
la...@garfieldtech.com
On Tue, May 30, 2023, at 2:42 AM, Andreas Hennings wrote:
> 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.
I would not be opposed to this. I don't know that I have any use cases for it,
but I'd be open to it.
--Larry Garfield
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php