Tipo PHPStorm che suggerisce sottoclassi di baseclass

Per quanto riguarda questo post:

In PHPStorm, come posso fare un lavoro di tipo hint quando ho un metodo di superclass che restituisce un tipo diverso da each sottoclass ,

questo riguarda un caso limite in hint di tipo PHPStorm. Per favore prova a seguire – Farò del mio meglio per essere il più chiaro ansible:

Quindi, ho questa class astratta di base:

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

quale un'altra class eredita da:

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

e che è ulteriormente esteso da una terza class:

 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); } 

Di seguito è riportto un esempio della class myModel:

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

La mia vera domanda è come "phpdoc" correttamente questo scenario:

Una sottoclass myNewController utilizza una variabile ereditata _model per assegnare un'istanza di un'altra class myModel che ha un form function univoco. Come dovrebbe PHPStorm scoprire correttamente il form in myNewController ?

La mia soluzione finora implica la documentazione di myBaseController questo modo:

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

Comunque penso che @var object sia troppo ampio (PHPStorm non troverà la sua dichiarazione) e la mia ipotesi è che ci dovrebbe essere un modo migliore (e più specifico) per farlo.

Forse potremmo invece fare:

 /** * @var BaseModel */ 

se PHPStorm avesse un modo di esaminare le sottoclassi per il metodo.

Qualche idea? Grazie a tutti in anticipo.

Puoi specificare il tipo di properties; nella sottoclass senza introdurre nuovo codice, usando l'annotazione @property :

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

Anche se forse non è la migliore pratica, questo functionrà sicuramente per te.

Puoi "scavalcare" il membro di _model nella sottoclass e documentarlo come nella sottoclass di BaseModel.

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

Per documentare il return del metodo di class, usa return $this ; return static funziona anche