PHP 7: anticipazioni e nuove features [INTERVIEW]

Enrico_Zimuel
24 aprile 2015
0 commenti

In attesa dell’uscita ufficiale di PHP 7 prevista entro fine anno abbiamo incontrato Enrico Zimuel alias @ezimuel, senior software engineer di Zend Technologies per farci raccontare qualche anteprima della nuova release.

Ciao Enrico, ti vuoi presentare? Che ruolo ricopri in Zend?

Sono un programmatore dal 1996 e dal 2008 ricopro il ruolo di senior software engineer nel dipartimento Ricerca e Sviluppo di Zend Technologies Ltd., the PHP Company di Cupertino (California). Zend Technologies è la società che sta dietro il PHP, e che contribuisce attivamente allo sviluppo del linguaggio a partire dalla versione 3, con il contributo di Andi Gutmans e Zeev Suraski, fondatori ed attuali CEO e CTO dell’azienda.
In Zend mi occupo principalmente dello sviluppo dei progetti open-source Apigility e Zend Framework e di attività di ricerca nell’architettura delle applicazioni web.

Quando uscirà PHP 7 e che fine ha fatto la versione 6?

L’uscita del PHP 7 è prevista per ottobre 2015, ma al momento è una data puramente indicativa, riportata nel PHP 7 RFC timeline (https://wiki.php.net/rfc/php7timeline).
Il PHP 6 non è mai stato rilasciato e dal momento che sono passati diversi anni da quando se n’è iniziato a parlare, la community ha deciso di far morire questa release e passare direttamente alla versione 7. Più che altro il passaggio alla 7 è stata un’esigenza di “marketing”, per prendere le distanze da una versione bistrattata come la 6, con poche e confuse novità sul linguaggio.

Quali saranno le nuove features della prossima major release e quali verranno classificate come deprecate in vista di una prossima cancellazione?

Le nuove feature del PHP 7 sono tante e significative, soprattutto sul versante performance. Il PHP 7 contiene una riscrittura completa del sistema di gestione dei dati come array, stringhe e tabelle hash. Lo spazio di memoria per l’allocazione delle variabili e dei loro puntatori è stato ridotto notevolmente. Ciò ha comportato un notevole miglioramento generale nelle performance del linguaggio.
Ad esempio, il codice seguente che genera un array di un milione di elementi, array con un solo elemento di tipo stringa:

$a = array();
for ($i = 0; $i < 1000000; $i++) $a[$i] = array("hello");
echo memory_get_usage(true);

con il PHP 5.6 occupa uno spazio in memoria di 428 MB con un tempo di esecuzione di 0.49 sec, mentre con il PHP 7 uno spazio di soli 33 MB con un tempo di esecuzione di 0.06 sec.
Una riduzione di circa 13 volte dello spazio di memoria e un miglioramento di 8 volte sulla velocità di esecuzione!

Sul versante del linguaggio, una novità del PHP 7 è il supporto ai return type, ossia alla possibilità di specificare il tipo di dato restituito da una funzione. Ad esempio, sarà possibile specificare che la funzione foo() restituisca un array in questo modo:

function foo(): array {

  return [];

}

Come si sa, il PHP non è un linguaggio tipizzato e la possibilità di specificare il tipo di una funzione può essere un aiuto per tutti coloro che vogliono produrre un codice più strutturato.

Sempre sul versante della definizione dei tipi, il PHP 7 supporterà gli Scalar Type Hints, ossia la possibilità di specificare il tipo di un parametro tra int, float, string e boolean.
Questa funzionalità è stata una delle più controverse nella community del PHP, proprio perché il PHP non è un linguaggio tipizzato e questa feature, era vista da molti come un tentativo per muoversi nella direzione dei linguaggi tipizzati.
Va comunque detto che di default, il PHP 7 non controllerà il tipo di dato in maniera rigorosa (strict), per cui sarà possibile ad esempio assegnare ad un parametro di tipo float un valore int, che verrà convertito in float automaticamente. Per abilitare la gestione strict dei tipi sarà necessario utilizzare il comando:

declare(strict_types=1);

all’inizio di uno script PHP. In questo modo, un codice di questo tipo genererà un fatal error.

declare(strict_types=1);
function sendHttpStatus(int $statusCode, string $message) {
  header('HTTP/1.0 ' .$statusCode. ' ' .$message);
}
sendHttpStatus(404, "File Not Found"); // ok
sendHttpStatus("403", "OK"); // fatal error

Un’altra feature interessante è il supporto alle classi anonime, ossia una classe senza nome, definita a runtime.
Ad esempio, sarà possibile restituire un oggetto di un classe anonima direttamente da una funzione:

/* return an anonymous implementation of a Page
for your MVC framework */
return new class($controller) implements Page {
  public function __construct($controller) {
    /* ... */
  }
  /* ... */
};

Tra le features che verrano deprecate ci sarà il vecchio costruttore di classe, introdotto nel PHP 4, tramite la funzione avente lo stesso nome della classe. A partire dal PHP 8, non sarà più possibile utilizzare questa funzione, ma bisognerà utilizzare obbligatoriamente la funzione __construct(). Il PHP 7 consentirà ancora di utilizzare il vecchio costruttore di classe, ma genererà un evento E_DEPRECATED (maggiori informazioni su https://wiki.php.net/rfc/remove_php4_constructors).

Su quali punti si sono concentrati gli sforzi degli sviluppatori per il rilascio di questa ultima versione?

Come già anticipato lo sforzo più importante è stato sul versante delle performance. Ciò ha comportato una riscrittura degli internal del linguaggio con un nuovo sistema di gestione della strutture dati in memoria. Un altro intervento importante è stato sul versante della consistenza delle funzioni interne del PHP. Come sappiamo le funzioni del PHP sono veramente tante, forse troppe. Non è raro scoprire nuove funzioni del linguaggio anche dopo anni di utilizzo.
Questo numero così elevato ha comportato non pochi problemi sulla nomenclatura, provocando molte inconsistenze. Ad esempio, quali delle seguenti sintassi è corretta? isset() o is_set()? isnull() o is_null()? merge() o array_merge()? Con il PHP 7 si sta tentando di ridurre queste inconsistenze soprattutto sul versante dei costruttori di classe delle funzioni interne del linguaggio. Per maggiori informazioni è possibile consultare la pagina della proposta “Constructor behaviour of internal classes”
https://wiki.php.net/rfc/internal_constructor_behaviour.

Cosa pensi di Hack e di HHVM? Cosa sta facendo la community per aumentare le performance di PHP e migliorare la verifica e la correzione dei bug ?

Hack e HHVM sono dei progetti interessanti. HHVM è il successore del progetto HipHop di Facebook ed è fondamentalmente un compilatore just-in-time (JIT) di codice scritto in PHP e Hack. Hack è un nuovo linguaggio basato su PHP che offre molte nuove funzionalità, alcune delle quali presenti anche nel PHP 7. Questi progetti sono stati sviluppati nei laboratori di Facebook dapprima per finalità interne, come sappiamo infatti Facebook è scritto principalmente in PHP, e dopo come open source per un utilizzo generico. Il successo di un linguaggio o di una tecnologia può essere solo misurato con la sua popolarità. Il PHP è utilizzato da 20 anni, la sua prima release risale al 1995; al momento è il linguaggio più utilizzato al mondo per lo sviluppo di applicazioni web e siti internet, nel 2013 si contavano più di 240 milioni di siti web basati su questa tecnologia. Per poter competere con questi numeri impressionanti occorre una vera e propria rivoluzione. Hack e HHVM sono progetti interessanti, ma il loro utilizzo al momento è limitato, inoltre il PHP 7 offre delle velocità di esecuzione del tutto paragonabili a HHVM, quindi il fattore performance non è più così rilevante.

Cosa prepara #PHP nei prossimi rilasci in termini di sicurezza?

Non ci sono delle nuove funzionalità sul versante sicurezza per il PHP 7, bensì delle modifiche sulla consistenza del linguaggio che garantiranno sicuramente dei vantaggi nella scrittura di applicazioni più sicure.
Ad esempio, la già citata funzionalità di return type può aiutare la scrittura di un codice più robusto, così come la nuova funzionalità di engine exception in grado di gestire eccezioni a seguito di errori del PHP come “fatal error”.
Prima della versione 7 in PHP la gestione di questi errori era molto limitata e non era possibile utilizzare il costrutto try-catch. Ora sarà possibile gestire questi errori con le eccezioni, ad esempio nel caso di una funzione non esistente:

try {
  nonExistentFunction();
} catch (\EngineException $e) {
  var_dump($e);
}

il risultato sarà un oggetto engine exception con le seguenti informazioni:

object(EngineException)#1 (7) {
  ["message":protected] => string(32) "Call to undefined function nonExistantFunction()"
  ["string":"BaseException":private] => string(0) ""
  ["code":protected] => int(1)
  ["file":protected] => string(17) "engine-exceptions.php"
  ["line":protected] => int(1)
  ["trace":"BaseException":private] => array(0) {}
  ["previous":"BaseException":private] => NULL
}

Tutte queste nuova funzionalità consentiranno di gestire meglio gli errori, prevenendo quindi potenziali information leakage.

Per concludere quali features inseriresti in una nuova versione di PHP?

Più che aggiungere, eliminerei alcune funzioni non molto utilizzate ed inconsistenti, per avere un set minimale più facile da mantenere. Sicuramente il PHP 7 è un grande passo avanti in questa direzione, ma a mio avviso ci sono ancora ampi spazi di manovra.

Luca  Zucconi Web Product Manager