Re: BC break: ReflectionMethod::invoke() expects parameter 1 to be object, string given
| From: | Alexander Lisachenko | Date: | Mon, 22 Aug 2016 14:29:54 +0000 |
| Subject: | Re: BC break: ReflectionMethod::invoke() expects parameter 1 to be object, string given | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-95377@lists.php.net to get a copy of this message | ||
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 <levim@php.net>:
> On Mon, Aug 22, 2016 at 5:17 AM, Nicolas Grekas <
> nicolas.grekas+php@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
>