2015-09-30 2 views
9

En ce qui concerne cette publication:type PHPStorm laissant entendre sous-classes de baseclass

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

celui-ci est d'environ un cas limite dans typage PHPStorm. S'il vous plaît essayer de suivre - je ferai de mon mieux pour être aussi clair que possible:

Alors, j'ai cette classe abstraite base:

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

une autre classe qui hérite de:

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

et qui est encore prolongée par une troisième 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); 
    } 

Ci-dessous est un échantillon de la classe myModel:

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

Ma vraie question est de savoir comment bien « phpdoc » ce scénario:

Une sous-classe myNewController utilise une variable héritée _model pour attribuer une instance d'une autre classe myModel qui a une fonction unique form. Comment PHPStorm doit-il savoir correctement à propos de form dans myNewController?

Ma solution ce jour consiste à documenter myBaseController comme ceci:

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

Cependant, je pense @var object est trop large (PHPStorm ne trouvera pas sa déclaration) et je suppose qu'il devrait y avoir un meilleur (et plus spécifique) façon de le faire.

Peut-être que nous pourrions faire à la place:

/** 
* @var BaseModel 
*/ 

si PHPStorm avait une façon de regarder dans les sous-classes pour la méthode.

Des idées? Merci d'avance.

+1

Essayez: '/ ** * @var $ variableName ClassName * /' – vaso123

+0

@lolka_bolka Si je le fais, ça marchera, mais '$ _model' se verrouillera à' ClassName'. '$ _model' devrait être libre d'être assigné à l'une de mes classes de modèles où chacune peut avoir des méthodes uniques. Par conséquent, je devrais - idéalement - documenter '$ _model' depuis la sous-classe' myNewController'. – kstratis

+0

Pourriez-vous commenter sur le downvote? – kstratis

Répondre

8

Vous pouvez spécifier le type de propriété dans votre sous-classe sans introduire un nouveau code, en utilisant l'annotation @property:

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

Merci! Cela a fait le travail! – kstratis

+0

Bon à savoir. Je ne connaissais pas cette annotation '@ property'. – charlesrockbass

-1

Pour documenter le retour de la méthode de classe, utilisez return $this; return static fonctionne également

1

Bien que ce ne soit peut-être pas la meilleure pratique, celle-ci fonctionnera certainement pour vous.

Vous pouvez "remplacer" le membre _model dans la sous-classe et le documenter comme sous-classe de BaseModel.

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

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

Cela fonctionne et j'aurais accepté votre répondre s'il n'a pas introduit de nouveau code/restructuration. Bon à savoir cependant. – kstratis

+0

C'est bon. C'était ma meilleure pensée jusqu'à présent, mais la réponse de @ fschmengler est bien meilleure. Vis et apprend! ;) – charlesrockbass