2011-08-16 19 views
6

Come utente di Emacs, l'unica cosa che invidio per gli editor "moderni" come PDT è che PDT comprende i tipi e persino "suggerimenti di tipo" di PHPDoc, ad es.L'interprete PHP può essere informato dei suggerimenti di tipo PHPDoc?

/** 
    * @param DateTime $date 
    * @param string $name 
    * @return DOMDocument 
    */ 

Attualmente io uso di tipo suggerimenti ovunque posso per rendere l'interprete PHP Avvisami se ottengo il tipo di parametro sbagliato, ma che funziona solo se il parametro è un oggetto. Ancora più importante, non c'è modo di garantire che il valore di ritorno di una funzione sia di un tipo specifico.

Questa operazione potrebbe richiedere molto tempo, ma esistono plug-in o altri modi per rendere l'interprete PHP a conoscenza dei commenti di PHPDoc nello stesso modo in cui è PDT? Idealmente, mi piacerebbe ottenere errori fatali se restituisco un valore del tipo sbagliato, o se passo una stringa dove ho dichiarato il parametro come int, per esempio.

+0

Come la domanda, ma per quanto ne so la risposta è che non è possibile. – MitMaro

+2

PHP è tipicamente scritto in modo dinamico e debolmente, quindi provare a rinforzare i tipi sarà una battaglia in salita. – erisco

+2

Check out [PHPLint] (http://www.icosaedro.it/phplint/) – shesek

risposta

1

No. PHP non supporta la dichiarazione di tipo esplicito o il tipo di suggerimento, l'uso di type juggling è esplicitamente parte dell'interprete PHP. Secondo il suggerimento del tipo documents, sono supportati solo i suggerimenti sugli oggetti e sul tipo di array.

Detto questo, se si dispone di una funzione con requisiti di tipo stretto, diventa essenziale convalidare tali argomenti all'inizio di una funzione. Se sei molto legato all'idea dei tipi in PHP, puoi a) passare a una lingua tipizzata (heh) o b) usare un pattern autoboxing/object-wrapper. È prevista una penale di prestazioni significative a questo, ma invece di utilizzare controlli primitivi per tipo (ad esempio is_string), è possibile creare la classe wrapper e il tipo di utilizzo hinting:

class StringWrapper { 
    public $value = null; 
    function __construct($val) { 
    $this->value = $val; 
    } 

} 

function requires_a_string(StringWrapper $string_value) { 
echo $string_value->value; 
} 

$string = new StringWrapper('Hello world!'); 

Come si può vedere, questa è una bella grande collina a salire (con la creazione di un wrapper per ogni tipo) solo per evitare:

function requires_a_string($string_value='') { 
if (!is_string($string_value)) 
    return false; 
echo $string_value; 
} 

Il mio verdetto è: non vale la pena.

Si può leggere ancora un po 'sul autoboxing qui: http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english-version/ Inoltre, notare questo RFC per autoboxing: https://wiki.php.net/rfc/autoboxing E' stato intorno per un po ', però, quindi non avrebbe resistito per esso.

+0

Sì, no non voglio scalare neanche quella collina. Ecco perché speravo che qualcuno con troppo tempo a disposizione avrebbe scritto un plug-in o un modulo che fa automaticamente queste cose. Non sembra che sia così ... –

2

Si dovrebbe esaminare l'estensione SplTypes (attenzione: è sperimentale). Questo permette di suggerire il tipo di "primitivi" (l'ultima volta che ho sentito che sono migliori dei primitivi in ​​ogni modo immaginabile).

Non è possibile rendere l'interprete forzare le primitive in alcun altro modo, sebbene ci sia una soluzione inimmaginabile e fastidiosa che lascerò come esercizio per il lettore.

+0

Va notato che questa estensione è sperimentale, può essere eliminata in qualsiasi momento e ha un grande sovraccarico. Inoltre, questo non è vero tipizzazione, ma piuttosto è un'implementazione di object wrapping. –

+0

Ciò è potenzialmente interessante, anche se devo ammettere che non sono un grande fan della sintassi $ int = new SplInt (94); Ma insieme al pacchetto di sovraccarico dell'operatore PECL potrebbe essere una soluzione. –

+0

@Chris Grazie per averlo indicato. Mi ero dimenticato (non lo uso mai da solo, penso solo che sia bello). – cwallenpoole

0

E 'stato grande discussione come fare tipo hinting per i tipi scalari:

  • fortemente la data Tipo
  • Provare a destreggiarsi sempre
  • Provare a destreggiarsi se obivios cioe '123' a INT (123), ma non '123aaa' a int (123)

ma per quanto ne so adesso soluzione agli sviluppatori di non utilizzare tipo scalare hinting a tutti

PHP manual dice:
Gli hint di tipo possono essere solo dell'oggetto e dell'array (dal PHP 5.1). L'hint di tipo tradizionale con int e string non è supportato.

Problemi correlati