Intereting Posts
Как использовать запрос базы данных с JOIN в режиме обработки на стороне сервера PHP gzuncompress с ошибками чтения и записи файлов Использование Emacs для веб-разработки? (PHP / MySQL / JavaScript / CSS / HTML Как генерировать случайное 64-битное значение как десятичную строку в PHP Счетчик отношений Laravel OrderBy Использовать агрегированный метод с новыми классами драйверов MongoDB в PHP Хорошее решение для единого входа для Laravel Как добавить разбивку на страницы в массиве Перечислить зарегистрированные пространства имен объекта PHP DOMDocument PHP preg_match необходимо для обеспечения только одного символа пробела между словами Как сделать расширение PHP Работа Codeigniter cron не работает «Переходные» свойства в классе PHP? Генерировать случайный массив с предсказуемым заполнением Вход пользователя с одним запросом и солью пользователя для каждого пользователя

Можно ли указать динамический тип, возвращаемый в PhpStorm?

У меня есть 3 класса:

class Foo { static function test() { return new static(); } } class Bar extends Foo {} class Baz extends Foo {} 

Теперь, если вы звоните:

 $var = Bar::test(); 

Я хочу, чтобы PhpStorm идентифицировал $var как called_class , здесь: Bar .

Но, если я делаю $var = Baz::test(); $var – пример Baz .

Как я могу заставить динамический call_class указать PhpStorm, какой тип возвращается?

Я там синтаксис вроде

 /** @return "called_class" */ 

помочь PhpStorm и указать тип?

Сначала у вас есть ошибка в вашей статической функции. Вы не можете использовать

  return $this; 

поскольку статический вызов не будет создавать какой-либо экземпляр. Поэтому вам нужно создать новый экземпляр.

 class Foo { public static function test() { return new static(); } } 

Статическое ключевое слово будет создавать экземпляр нового экземпляра самого класса.

 class Bar extends Foo { public function fooBar(){} } class Baz extends Foo { public function fooBaz(){} } 

Я просто добавил функции foo, чтобы показать вам, что phpStorm теперь правильно найдет источник.

 $var = Bar::test(); $var->fooBar(); 

$ var теперь является экземпляром Bar

 $var2 = Baz::test(); $var2->fooBaz(); 

$ var2 теперь является экземпляром Baz