Что касается этого поста:
В 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 был способ поиска в подклассах для метода.
Есть идеи? Спасибо всем заранее.
Вы можете указать тип свойства в своем подклассе, не вводя новый код, используя аннотацию @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