Тип PHPStorm, указывающий подклассы базового слоя

Что касается этого поста:

В PHPStorm, как я могу сделать работу типа намека, когда у меня есть метод суперкласса, который возвращает другой тип из каждого подкласса ,

это один из граничного случая в намеке типа PHPStorm. Пожалуйста, попробуйте следовать за мной – я сделаю все возможное, чтобы быть максимально ясным:

Итак, у меня есть этот базовый абстрактный класс:

abstract class myBaseController { protected $_model; ... } 

который другой класс наследует от:

 class myController extends myBaseController { $hello = 'hello'; ... } 

и который далее распространяется третьим классом:

 class myNewController extends myController { public $myvar; $this->_model = new myModel(); ... public function myFunc(){ // !!form is underlined as: "Method 'form' not found in class"!! $form = $this->_model->form($new_variable); } 

Ниже приведен образец класса myModel:

 class myModel extends BaseModel { $world = 'world'; public function form($my_variable) { do_something(); } 

Мой истинный вопрос – как правильно «phpdoc» использовать этот сценарий:

Подкласс myNewController использует унаследованную переменную _model для назначения экземпляра другого класса myModel который имеет уникальную form функции. Как PHPStorm правильно узнает о form в myNewController ?

Мое решение до сих пор включает документирование myBaseController следующим образом:

 abstract class myBaseController { /** * @var object */ protected $_model; ... } 

Однако я думаю, @var object слишком широк (PHPStorm не найдет его объявление), и я предполагаю, что должен быть лучший (и более конкретный) способ сделать это.

Возможно, мы могли бы сделать так:

 /** * @var BaseModel */ 

если у PHPStorm был способ поиска в подклассах для метода.

Есть идеи? Спасибо всем заранее.

Solutions Collecting From Web of "Тип PHPStorm, указывающий подклассы базового слоя"

Вы можете указать тип свойства в своем подклассе, не вводя новый код, используя аннотацию @property :

 /** * @property myModel $_model */ class myNewController extends myController 

Хотя, возможно, и не самая лучшая практика, эта, безусловно, будет работать на вас.

Вы можете «переопределить» _model в подклассе и документировать его как подкласс BaseModel.

 // superclass abstract class myBaseController { /** * @var BaseModel */ protected $_model; ... } // subclass class myNewController extends myBaseController { /** * @var MyDerivedModel */ protected $_model; ... } 

Чтобы документировать возврат метода класса, используйте return $this ; также работает return static