2016-07-11 105 views
9

PHP 7 sta lentamente srotolava e la gente iniziare a lavorare con esso, e lo sono anch'ioLa dichiarazione del tipo nelle funzioni consente di migliorare il mio codice?

Una delle nuove funzionalità di PHP7 è che si può give functions a type declaration per gli ingressi, e una dichiarazione di tipo per il risultato.

esempio, un ingresso deve essere una stringa, uno un int e il risultato sarà booleano:

// PHP <7 
function foo($example, $someNumber) {} 
// PHP 7 
function foo(string $example, int $someNumber): bool{} 

senza declare(strict_types=1) so che quando si inserisce il tipo sbagliato, esso viene convertito. Se si immette un numero per $example, verrà convertito in stringa. Se aggiungi un numero float come $someNumber, verrà convertito in un numero tondo. Con la declinazione, si ottiene un errore di tipo.

Oltre alle possibili "best practice", l'aggiornamento del codice con le dichiarazioni di tipo migliorerebbe le prestazioni del codice? Penso che potrebbe essere perché sto dicendo all'interprete cosa aspettarsi, ma potrebbe anche aggiungere un controllo di tipo extra.
Vale la pena lo sforzo e il tempo per aggiornare queste funzioni?

+5

Gran parte dei suggerimenti tipo è che sono un aiuto * per il programmatore *. Con gli strumenti giusti (IDE intelligenti, correttori di tipo statico), è possibile evitare intere classi di errori prima ancora che il codice venga eseguito. Poiché PHP non è in genere compilato in anticipo, probabilmente non ci saranno molti miglioramenti delle prestazioni come farebbe un compilatore statico. – deceze

risposta

17

In definitiva, le prestazioni non dovrebbero essere la vostra preoccupazione quando si aggiungono dichiarazioni di tipo. Esistono per semplificare la vita del programmatore, non per l'interprete. Usali se pensi che ti saranno utili. È improbabile che si utilizzino o meno le dichiarazioni di tipo come principale fattore determinante delle prestazioni del codice.

Con ciò detto, attualmente (PHP 7.0) c'è in realtà una piccola prestazione penalità quando si usano le dichiarazioni di tipo, perché PHP ora deve controllare i tipi di valori che si passano dentro e fuori dalle funzioni. È più veloce non controllare affatto, che è ciò che accade quando non si ha una dichiarazione di tipo.

Tuttavia, è un po 'più sfumato di quello, e la situazione sta cambiando.

forze tipizzazione forte di passare i tipi corretti

Se si utilizza la tipizzazione forte, devi passare un valore del tipo ideale (ad esempio int), invece di essere in grado di passare qualche altro tipo (es. stringa) e convertirlo in PHP per te. Passare il tipo corretto è più veloce che avere la conversione PHP da un altro tipo per te: digitare le conversioni richiede tempo.

dichiarazioni di tipo possono evitare ripetute conversioni di tipo

Se si utilizza dichiarazioni di tipo, sia con la tipizzazione forte o no, di solito si evita di conversioni di tipo ripetute per lo stesso valore.

Normalmente, se si dispone di una funzione che esegue diverse operazioni di numero e si passa a un argomento di stringa, PHP dovrà convertirlo nel tipo di numero appropriato (int o float) ogni volta che esegue un'operazione con esso.

Ma se si dispone di una dichiarazione di tipo su quell'argomento, viene convertito una sola volta, automaticamente (modalità di digitazione debole) o perché l'hai convertito in modo esplicito.

dichiarazioni di tipo consentono di PHP per elidere tipo di controlli

dichiarazioni di tipo consentono alle garanzie PHP di runtime che a volte può utilizzare per evitare di tipo controlli che ha a che fare altrimenti. Ad esempio, assumere la seguente riga di codice:

$a = $b * $c; 

Senza dichiarazioni di tipo, PHP deve prima fare un controllo di tipo interno $b e $c prima che possa effettivamente moltiplicare; PHP deve assicurarsi che siano entrambi i tipi di numeri, convertirli se non lo sono, e quindi eseguire il tipo appropriato di moltiplicazione (int × int, float × int, ecc.).

Ma se hai dichiarato in anticipo i tipi di $b e $c, PHP non deve controllarli qui e può immediatamente eseguire la moltiplicazione effettiva. È più veloce Ciò è particolarmente vero se si eseguono più operazioni con queste variabili all'interno della funzione.

Questa ottimizzazione è implementata in PHP 7.1 quando si utilizza OPcache.

È possibile implementare ottimizzazioni simili per eliminare anche i controlli di tipo argomento e valore restituito. Ad esempio, se una funzione dichiara che un parametro è un int, non è necessario controllarne nuovamente il tipo se poi passa quell'argomento a un'altra funzione che si aspetta anche un int. PHP 7.1 può attualmente eliminare alcuni controlli di tipo restituiti non necessari (e altro ancora quando si utilizza OPcache), ma non i controlli di tipo argomento.

A causa di questi tipi di ottimizzazioni, la penalizzazione delle prestazioni per il codice con le dichiarazioni di tipo si sta riducendo e il potenziale di codice con le dichiarazioni di tipo è più rapido del codice senza futuro.

+2

PHP 7.1 può rimuovere alcuni controlli di tipo restituito, ma attualmente non vengono elidati i controlli degli argomenti. – NikiC

+0

Per quanto riguarda "Questa ottimizzazione è implementata in PHP 7.1 quando si usa OPcache", hai qualche fonte per questo o hai passato attraverso il codice C per trovarlo? E se comprendo correttamente la tua risposta, in PHP 7.1 la penalità * delle prestazioni * è ridotta con OPCache, ma è pur sempre una penalità rispetto al codice senza dichiarazioni di tipo. Sai se la situazione è la stessa per PHP 7.2? –

+0

@ rink.attendant.6 Dmitry Stogov ci ha scritto un po 'sulla mailing list di PHP internals IIRC, ma non sono sicuro di come individuarlo. – Andrea