2015-09-30 10 views
9

Rispetto a questo post:tipo PhpStorm accennando sottoclassi di baseclass

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

questo è circa un caso limite in PhpStorm tipo hinting. prega di provare a seguire - Farò del mio meglio per essere il più chiaro possibile:

Così, ho questo classe astratta di base:

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

che un'altra classe eredita da:

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

e che è ulteriormente esteso da una terza classe:

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

Sotto è un campione della classe MyModel:

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

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

Una sottoclasse myNewController sta utilizzando una variabile ereditata _model per assegnare un'istanza di un altro classe myModel che ha una funzione unica form. Come dovrebbe PHPStorm scoprire correttamente su form in myNewController?

La mia soluzione finora coinvolge documentare myBaseController come questo:

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

Tuttavia penso @var object è troppo ampia (PhpStorm non troverà la sua dichiarazione) e la mia ipotesi è che ci dovrebbe essere una migliore (e più specifico) per farlo.

Forse potremmo invece fare:

/** 
* @var BaseModel 
*/ 

se PhpStorm aveva un modo di guardare negli sottoclassi per il metodo.

Qualche idea? Grazie a tutti in anticipo.

+1

Prova: '/ ** * @var $ nomeVariabile NomeClasse * /' – vaso123

+0

@lolka_bolka Se lo faccio funzionerà ma poi '$ _model' si bloccherà in' ClassName'. '$ _model' dovrebbe essere libero di essere assegnato a uno qualsiasi dei miei corsi modello in cui ognuno di essi può avere metodi univoci. Perciò dovrei -ideally- documentare '$ _model' all'interno della sottoclasse' myNewController'. – kstratis

+0

Potresti commentare il downvote? – kstratis

risposta

8

È possibile specificare il tipo di proprietà nella sottoclasse senza introdurre il nuovo codice, utilizzando il @property della nota:

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

Grazie! Questo ha fatto il lavoro! – kstratis

+0

Bello sapere. Non conoscevo questa annotazione '@ property'. – charlesrockbass

-1

Per documentare il ritorno del metodo di classe, utilizzare return $this; return static funziona anche

1

Anche se forse non è la migliore pratica, questo funzionerà sicuramente per voi.

È possibile "ignorare" il membro _model nella sottoclasse e documentarlo come nella sottoclasse di BaseModel.

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

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

Funziona e avrei accettato il tuo rispondi se non ha introdotto alcun nuovo codice/ristrutturazione. Buono a sapersi però. – kstratis

+0

Va bene. Questo è stato il mio miglior pensiero fino ad ora, ma la risposta di @ fschmengler è molto meglio. Vivere e imparare! ;) – charlesrockbass