2013-07-16 11 views
13

Ich habe Code mehr oder weniger wie folgt aus:PhpStorm Typ-Hinweise für Fabriken?

class Foo { 
    public static function factory($str) { 
     $class = "Foo_" . $str; 
     return new $class; 
    } 
} 
class Foo_Bar { 
    public function razzle() { 
     print "Foo_Bar->baz() was called"; 
    } 
} 

$Obj = Foo::factory('Bar'); 

und ich möchte PhpStorm verstehen, dass $Obj ein Foo_Bar Objekt ist, so dass zum Beispiel, wenn ich tippe $Obj->raz, razzle() wird für die automatische Vervollständigung angezeigt.

Gibt es eine Möglichkeit, das zu bekommen? Um PhpStorm mitzuteilen, dass die Funktion Foo::factory($str) ein Objekt vom Typ Foo_$str zurückgibt? Meine Vermutung ist, dass die Antwort nein ist.

Antwort

5

Ja, Sie können dies tun, wenn Ihre Fabrik eine statische Methode ist. Es sollte für die von Ihnen bereitgestellten Beispiele funktionieren.

Weitere Details und einige einfaches Beispiel kann hier gefunden werden: http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

+0

Vielleicht mache ich etwas falsch, aber es scheint nicht für mich zu arbeiten. Ich benutze PHPStorm 6.0.3. Ich habe die folgenden zwei Dateien in einem neuen leeren Projekt erstellt: http://pastie.org/8146899, aber ich bekomme keine Art von Vervollständigung auf '' $ x -> ... ' –

+1

Arbeit für mich. 1) Datei mit Metadaten muss heißen '.phpstorm.meta.php'; 2) Es wird nicht sofort aufgenommen - Schließen und erneutes Öffnen des Projekts (Suche nach einer solchen Datei erfolgt beim Laden des Projekts; sobald eine Datei gefunden wurde, sollten Änderungen sofort aufgenommen werden) - Dieses Verhalten wurde behoben v7. – LazyOne

+0

Danke! Ich wusste nicht, dass der Name benötigt wird, es funktioniert jetzt wunderbar. –

12

Soweit ich weiß, können Sie PHPStorm nicht verstehen lassen, was Foo herausgibt, weil es dynamisch ist. Sie können jedoch sicher PhpStorm sagen, was Ihre $ Obj Variable ist, durch einen doc Kommentar darüber setzen, etwa so:

/** @var Foo_Bar $Obj */ 
$Obj = Foo::factory('Bar'); 
+1

Das lässt PhpStorm über $ Objs Dataype wissen, aber was ich will, ist, dass PhpStorm über den Rückgabetyp von Foo :: factory() weiß - ich will nicht, dass PhpDoc @ var jedes Mal eine Fabrik benutzt nur ein hässlicher Hack. LazyOne's Antwort klang vielversprechend, aber ich kann es nicht zur Arbeit bringen; Ich vermute, dass ich einen Schritt verpasse. –

+1

@ hobbit.trap * "das ist nur ein hässlicher hack" * - ist es nicht. PHPDoc selbst hat keinen Mechanismus zur Bereitstellung eines dynamischen Rückgabetyps (aus dem tatsächlichen String-Parameterwert). Wenn es nicht im tatsächlichen Doc-Standard ist (der für Code-Hinweise verwendet wird), warum erwartest du, dass dies magisch funktioniert? – LazyOne

+0

@LazyOne Wie Sie bemerken, hat PHPDoc diesen Mechanismus nicht eingebaut. Sicherlich wird jede PHPDoc-basierte Lösung notwendigerweise ein Hack sein. Aber ich war nicht auf der Suche nach einer PHPDoc-Lösung, ich suchte nach einer PhpStorm-Lösung - die Sie oben angegeben haben, vielen Dank! –

1

Sie PhpStorm Metadaten verwenden sollten, die für die dynamische und statische Anrufe funktioniert.

class Foo { 
    public function factory($str) { 
     $class = "Foo_" . $str; 
     return new $class(); 
    } 
} 
class Foo_Bar { 
    public function baz() { 
     print "Foo_Bar->baz() was called"; 
    } 
} 

$Obj = Foo->factory('Bar'); 
$Obj->baz(); 

eine Datei in Ihrem Projektstammverzeichnis erstellen und benennen es .phpstorm.meta.php:

<?php 

namespace PHPSTORM_META { 
    $STATIC_METHOD_TYPES = [ 
     \Foo::factory('') => [ 
      "Bar" instanceof \Foo_Bar, 
     ], 
    ]; 
} 

dank @LazyOne für Link.

Verwandte Themen