2013-07-16 12 views
13

Ho codice più o meno così:PhpStorm type-hinting per le fabbriche?

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

e vorrei PhpStorm capire che $Obj è un oggetto Foo_Bar, in modo che per esempio se di tipo $Obj->raz, razzle() verranno visualizzati per il completamento automatico.

C'è un modo per ottenere questo? Per dire a PhpStorm che la funzione Foo::factory($str) restituisce un oggetto di tipo Foo_$str? La mia ipotesi è che la risposta sia no.

risposta

5

Sì, è possibile fare questo se la vostra fabbrica è un metodo statico. Dovrebbe funzionare bene per gli esempi che hai fornito.

Maggiori dettagli e qualche esempio di base si possono trovare qui: http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

+0

Forse sto facendo qualcosa di sbagliato, ma non sembra funzionare per me. Sto usando PhpStorm 6.0.3. Ho creato i seguenti due file in un nuovo progetto vuoto: http://pastie.org/8146899, ma non ottengo alcun tipo di completamento automatico su '' $ x -> ... ' –

+1

Lavoro per me. 1) Il file con i metadati DEVE essere chiamato '.phpstorm.meta.php'; 2) Non verrà raccolto istantaneamente - chiudi e riapri il progetto (la ricerca di tale file viene eseguita sul carico del progetto, una volta trovato il file, le modifiche dovrebbero essere immediatamente rilevate) - questo comportamento è stato risolto V7. – LazyOne

+0

Grazie! Non mi ero reso conto che il nome fosse richiesto, ora funziona magnificamente. –

12

Per quanto ne so, non puoi fare in modo che PHPStorm capisca che cosa sta dando Foo, perché è dinamico. Tuttavia si può sicuramente dire che cosa il vostro PhpStorm variabile $ Obj è, mettendo un commento di documentazione sopra di essa, in questo modo:

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

Ciò consente a PhpStorm di conoscere il dataype di $ Obj, ma quello che voglio è che PhpStorm conosca il tipo di dati restituito di Foo :: factory() - Non voglio PhpDoc @ var ogni volta che uso una fabbrica, cioè solo un brutto scherzo. La risposta di LazyOne sembrava promettente, ma non riesco a farlo funzionare; Sospetto che mi manchi un passaggio. –

+1

@ hobbit.trap * "è solo un brutto scherzo" * - non lo è. PHPDoc non ha alcun meccanismo per fornire un tipo di ritorno dinamico (build dal valore effettivo del parametro stringa). Se non è nel vero standard di Doc (che è usato per suggerire il codice), perché ti aspetti che funzioni magicamente? – LazyOne

+0

@LazyOne Come si nota, PHPDoc non ha questo meccanismo integrato. Certamente quindi qualsiasi soluzione basata su PHPDoc sarà, necessariamente, un hack. Ma non stavo cercando una soluzione PHPDoc, stavo cercando una soluzione PhpStorm - che hai fornito sopra, molte grazie! –

1

Si dovrebbe usare metadati PhpStorm, che funziona sia per le chiamate dinamiche e statiche.

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

creare un file nella directory principale del progetto e denominarlo .phpstorm.meta.php:

<?php 

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

grazie @LazyOne per il link.

Problemi correlati