Hello, there is one more issue with ReflectionMethod::invoke() for static
methods: it's impossible to call an overridden parent static method and
preserve a scope information:

// https://3v4l.org/ASntq

class foo
{
    static function bar()
    {
        echo self::class, ' vs ', static::class, PHP_EOL;
    }

    static function bar1()
    {
        echo self::class, ' vs ', static::class, PHP_EOL;
    }
}

class baz extends foo
{
    static function bar()
    {
        echo self::class, ' vs ', static::class, PHP_EOL;
    }
}

$r = new ReflectionClass('baz');
$m = $r->getMethod('bar1'); // without overriden method - it's ok, our
static scope is preserved
$m->invoke(null); // foo vs baz

$r = new ReflectionClass('baz');
$m = $r->getMethod('bar'); // with overriden method it's impossible to call
parent static method, no way to specify a scope.
$m->invoke(null); // baz vs baz

// how to statically call the parent static method bar() with scope == baz??

2016-08-22 17:00 GMT+03:00 Levi Morrison <le...@php.net>:

> On Mon, Aug 22, 2016 at 5:17 AM, Nicolas Grekas <
> nicolas.grekas+...@gmail.com> wrote:
>
> > Hello,
> >
> > now that the BC break on ReflectionType has been reverted, another one
> > remains in ReflectionMethod::invoke():
> >
> > the method doesn't accept a string as first argument anymore, see e.g.:
> >
> > https://3v4l.org/pImmv
> >
> > As you can see, this worked since 5.0 and even in HHVM.
> >
> > It would be great to fix this BC break please.
> >
> > Regards,
> > Nicolas
> >
>
> According to the [documentation][1] it requires an object. If the
> documentation has not been altered recently to make it this way then I'm
> inclined to keep the backward compatibility break. Your example uses a
> static method - you should be passing null and not the name of the class
> (this is also in the documentation).
>
>   [1]: http://php.net/manual/en/reflectionmethod.invoke.php
>

Reply via email to