2015-09-30 13 views
9

Im Hinblick auf dieses Thema anzudeuten:PhpStorm Typ Subklassen von Basisklasse

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

dieser ist über eine Kante Fall in PhpStorm Typ Hinting. Bitte versuchen Sie es zu folgen - ich werde mein Bestes tun, so klar wie möglich zu sein:

So habe ich diese Basis abstrakte Klasse bekam:

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

, die eine andere Klasse erbt von:

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

und die weiter durch eine dritte Klasse erweitert:

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

Nachfolgend finden eine Probe der MyModel Klasse:

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

Meine wahre Frage ist, wie man richtig „phpdoc“ dieses Szenario:

Eine Unterklasse myNewController wird mit einer vererbten Variable _model eine Instanz eines anderen vergeben Klasse myModel, die eine eindeutige Funktion hat form. Wie sollte PHPSstorm über form in myNewController richtig herausfinden?

Meine Lösung so weit beinhaltet myBaseController wie diese Dokumentation:

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

aber ich denke, @var object zu breit ist (PhpStorm wird seine Erklärung nicht gefunden) und meine Vermutung ist, dass es eine bessere sein sollte (und spezifischer) Weg, dies zu tun.

Vielleicht könnten wir stattdessen tun:

/** 
* @var BaseModel 
*/ 

wenn PhpStorm einen Weg in die Unterklassen für die Methode suchen hat.

Irgendwelche Ideen? Vielen Dank im Voraus.

+1

Versuchen: '/ ** * @var $ Variablennamen Klassennamen * /' – vaso123

+0

@lolka_bolka Wenn ich das mache, wird es funktionieren, aber '$ _model' wird auf' ClassName' festgelegt. '$ _model' sollte frei sein, um einer meiner Modellklassen zugewiesen zu werden, wo jedes einzelne Methoden haben kann. Daher sollte ich "$ _model" aus der Unterklasse 'myNewController' dokumentieren. – kstratis

+0

Könnten Sie bitte den Downvote kommentieren? – kstratis

Antwort

8

Sie können den Objekttyp in der Unterklasse angeben, ohne neuen Code einzuführen, mit der @property Anmerkung:

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

Danke! Das hat den Job gemacht! – kstratis

+0

Gut zu wissen. Wusste nicht von dieser '@ Eigenschaft' Annotation. – charlesrockbass

-1

Um die Rückgabe der Klassenmethode zu dokumentieren, verwenden Sie return $this; return static funktioniert auch

1

Obwohl vielleicht nicht die beste Praxis, diese wird sicherlich für Sie arbeiten.

Sie können das Element _model in der Unterklasse "überschreiben" und es als BaseModel-Unterklasse dokumentieren.

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

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

es funktioniert und ich hätte Ihre akzeptiert antworte, wenn kein neuer Code/Umstrukturierung eingeführt wurde. Gut zu wissen. – kstratis

+0

Es ist in Ordnung. Das war bisher mein bester Gedanke, aber @ fschmenglers Antwort ist tatsächlich viel besser. Lebe und lerne! ;) – charlesrockbass

Verwandte Themen