2015-09-30 4 views
9

В отношении этого поста:тип PhpStorm намекая подклассы BaseClass

In PHPStorm, how can I make type hinting work when I have a superclass method that returns a different type from each subclass,

это одно о краевой случае в намекая типа 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 был способ смотреть на подклассы для метода.

Любые идеи? Спасибо всем заранее.

+1

Try: '/ ** * @var $ имяПеременной ClassName * /' – vaso123

+0

@lolka_bolka Если я это сделаю, это сработает, но тогда '$ _model' будет заблокирован до' ClassName'. '$ _model' должен быть свободен от любого класса, где каждый может иметь уникальные методы. Поэтому я должен -идеально документировать '$ _model' из подкласса' myNewController'. – kstratis

+0

Не могли бы вы прокомментировать нижний предел? – kstratis

ответ

8

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

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

Спасибо! Это сработало! – kstratis

+0

Приятно знать. Не знал об этой аннотации '@ property'. – charlesrockbass

-1

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

1

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

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

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

// subclass 
class myNewController extends myBaseController { 
    /** 
    * @var MyDerivedModel 
    */ 
    protected $_model; 
    ... 
} 
+1

Это действительно работает, и я бы принял ваш ответьте, если он не вводит никакого нового кода/реструктуризации. Полезно знать. – kstratis

+0

Все в порядке. Это была моя лучшая мысль, но ответ @ fschmengler намного лучше. Живи и учись! ;) – charlesrockbass

Смежные вопросы