Php 7.2: Tutte Le Novitá

by admin Date: 24-11-2017 php


Il 30 Novembre 2017 è previsto il rilascio di una nuova versione del linguaggio di programmazione PHP, la 7.2. Questa versione è il frutto di 6 mesi di test con il rilascio di 12 versioni tra alpha, beta e Release Candidate (RC), l'ultima della quale rilasciata il 9 Novembre. In questo articolo sono riportate alcune delle principali novità introdotte con la versione 7.2.

Performance

Come sappiamo, le performance del PHP 7, rispetto alla versione precedente sono migliorate in maniera sbalorditiva. I tempi di esecuzione, secondo la maggior parte dei benchmark in circolazione, si sono praticamente dimezzati rispetto alla versione 5, rendendo il PHP uno dei linguaggi interpetati più veloci del mondo (vedi grafico).

Il PHP 7.2, rispetto al PHP 7.0 e 7.1 introduce ulteriori miglioramenti dal punto di vista delle performance, con un aumento di qualche punto percentuale.

Di seguito è riportato un benchmark eseguito da Michael Larabel e pubblicato in questa pagina web.

Tipo object

La prima novità riguarda l'introduzione di un nuovo tipo di variabile, object. Questo tipo può essere utilizzato per rappresentare tutti gli oggetti PHP. Di seguito è riportato un esempio:

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());

La funzione test accetta come parametro una variabile di tipo object e restituisce un valore di tipo object. E' possibile utilizzare qualsiasi oggetto, nell'esempio un'istanza di SplQueue o StdClass.

L'introduzione del tipo object colma una precedente lacuna del PHP, aggiungendo gli oggetti tra i tipi scalari del linguaggio. Questo nuovo tipo di variabile può risultare utile in tutti quei casi in cui sia necessario gestire il passaggio (o il ritorno) di oggetti provenienti da classi diverse (non in relazione tra loro).

Overriding di metodi astratti

Con il PHP 7.2 è possibile effettuare l'overriding (sovrascrittura) di metodi astratti. In particolare, è possibile omettere il tipo di un parametro in ingresso rispettandone la controvarianza (contravariance), ossia l'utilizzo di un vincolo meno restrittivo. Così come è possibile effettuare la covarianza (covariance) di un valore restituito da una funzione, ossia l'utilizzo di un tipo più restrittivo.

Di seguito è riportato un esempio:

abstract class A
{
    abstract function test(string $s);
}

abstract class B extends A
{
    abstract function test($s) : int;
}

Il metodo B::test() sovrascrive il metodo A::test() utilizzando un parametro in ingresso $s meno restrittivo (senza tipo) e specificando un valore in uscita più restrittivo (int).

L'overriding del metodo può avvenire anche nel caso di un'interfaccia. Di seguito è riportato un esempio:

interface A
{
    public function test(string $s);
}

class B implements A
{
    public function test($s){} 
}

Supporto algoritmo Argon2i

A partire dal PHP 7.2 è possibile utilizzare il nuovo algoritmo Argon2 per l'hash delle password utente. Questo algoritmo è considerato al momento il metodo più sicuro per la memorizzazione delle password utente. Argon2 offre una sicurezza superiore rispetto a bcrypt, l'algoritmo di default dalla funzione password_hash() del PHP. In particolare, Argon2 è stato progettato per mitigare possibili attacchi di forza bruta basati su algoritmi paralleli, eseguiti su GPU.

La versione utilizzata dal PHP 7.2 dell'algoritmo è la variante Argon2i ritenuta la più sicura per le password. Per utilizzarla è necessario utilizzare la funzione password_hash() del PHP specificando la costante PASSWORD_ARGON2I. Di seguito è riportato un esempio:

$password = 'test';
$hash = password_hash($password, PASSWORD_ARGON2I);
var_dump($hash);

Eseguendo questo script PHP la variabile $hash conterrà una stringa di 98 caratteri, simile alla seguente:

$argon2i
$v=19
$m=1024,t=2,p=2
$TmxLemFoVnZFaEJuT1NyYg
$4j2ZFDn1fVS70ZExmlJ33rXOinafcBXrp6A6grHEPkI

Questa stringa contiene 5 sequenze suddivise dai caratteri $. La prima (argon2i) è il nome della funzione hash; la seconda (v=19) è la versione dell'algoritmo; la terza contiene i parametri dell'algoritmo: m, il costo della memoria (espresso in kB); t, il costo di esecuzione e p, il costo del parallelismo. La quarta sezione contiene un valore pseudo-casuale (detto salt) utilizzato nell'algoritmo e l'ultima sezione contiene il valore hash vero e proprio.

Questa stringa di 98 caratteri può essere memorizzata in un database. La verifica può essere effettuata tramite la solita funzione password_verify() del PHP.

Crittografia avanzata con Sodium

Il PHP 7.2 offre il supporto alla libreria libsodium per funzionalità avanzate di crittografia, tramite la nuova estensione Sodium.

Quest'estensione offre numerose funzioni per l'utilizzo di algoritmi di crittografia moderni, come il supporto alla crittografia ellittica.

Il PHP è di fatto l'unico linguaggio al mondo ad offrire queste funzionalità avanzate di sicurezza. Per maggiori informazioni sulle funzionalità di Sodium, consiglio la lettura del post di Scott Arciszewski, PHP 7.2: The First Programming Language to Add Modern Cryptography to its Standard Library.

SQL query debug per PDO

La funzione PDOStatement::debugDumpParams consente di visualizzare informazioni di debug sull'interrogazione SQL generata attraverso l'utilizzo della funzione PDO::prepare. A partire dalla versione 7.2, questa funzione di debug consente di visualizzare anche la stringa SQL eseguita sul database.

Prima di questa versione, le informazioni di debug riportavano l'interrogazione SQL con la presenza di parametri in bind. Questa modalità non consentiva, a volte, un debugging efficace delle istruzioni SQL generate da PDO. Di seguito è riportato un esempio:

$pdo = new PDO(
    'mysql:dbname=test;host=localhost',
    'user',
    'password'
);
$sth = $pdo->prepare("SELECT * FROM user WHERE active=:active");
if (! $sth->execute(['active' => true])) {
    print_r($sth->errorInfo());
    exit(1);
}
$sth->debugDumpParams();

Il PHP 7.2 genera un output di questo tipo:

SQL: [39] SELECT * FROM user WHERE active=:active
Sent SQL: [35] SELECT * FROM user WHERE active='1'
Params:  1
Key: Name: [7] :active
paramno=-1
name=[7] ":active"
is_param=1
param_type=2

E' possibile notare la presenza della riga Sent SQL con l'interrogazione SQL effettivamente eseguita sul db. Questa è l'informazione che è stata aggiunta con il PHP 7.2.

Nuove funzioni

Il PHP 7.2 introduce alcune nuove funzioni, alcune delle quali sono: ftp_append(), hash_hmac_algos(), imagesetclip(), imagegetclip(), imageopenpolygon(), imageresolution(), imagecreatefrombmp(), imagebmp().

Per l'elenco completo delle nuove funzioni, è possibile far riferimento a questa pagina web.

Funzioni deprecate

Con il PHP 7.2 vengono deprecate alcune funzioni del linguaggio. Alcune di queste sono: metodo __autoload(), create_function(), gmp_random(), each(), assert() con un argomento di tipo stringa, parse_str() senza un secondo argomento, png2wbmp(), jpeg2wbmp().

Conclusioni

Le novità introdotte dal PHP 7.2 sono tante, tra le più significative il supporto del tipo object, l'utilizzo dell'algoritmo Argon2 per la memorizzazione sicura delle password e la nuova estensione Sodium per l'utilizzo di funzioni avanzate di crittografia.

Rimaniamo in attesa del rilascio della versione stabile 7.2.0 prevista per il 30 Novembre 2017.

 
by admin Date: 24-11-2017 php visite : 1630  
 
 
 
 

Articoli correlati



Questo sito fa uso di cookie, anche di terze parti, per migliorare la tua esperienza di navigazione. Accettando questa informativa dai il consenso al loro utilizzo. È possibile modificare le impostazioni dei cookie o ottenere ulteriori informazioni qui: Politica dei cookies.