Как хинтинг типа работает с Closure :: call? - PullRequest
0 голосов
/ 01 марта 2019

Я создал функцию с именем foo, которая вызывает вызываемый \Closure объект, созданный в bar.

В документации по Closure :: call () здесь говорится, что метод call "временно привязывает замыкание к newthis и вызывает его с любыми заданными параметрами".

В моем примере у меня нет никаких параметров, но я вызываю метод baz из объекта, который я вызываю.При выполнении кода он выдает «Hello world», как и ожидалось.Но моя IDE не может обнаружить метод baz в функции anoymus и вместо этого помечает предупреждение: Method baz not found in A.

class A
{
    public function bar(): string
    {
        $b = new B();

        return $b->foo(function(){
            return $this->baz();
        });
    }
}

class B
{
    public function foo(\Closure $callback): string
    {
        $callback->call($this);
    }

    public function baz(): string
    {
        return "Hello world!";
    }
}

Я могу добавить что-то вроде этого.

$b->foo(function(){
    /** @var B $this */
    return $this->baz();
});

Однако, если я запускаю статический анализ кода, такой как php stan.Затем он сообщает: Call to an undefined method A::baz().

Поэтому мой вопрос таков: как мне ссылаться на newthis в моей анонимной функции, возможно ли это вообще?

...