novità della versione 7.2 di php

Performance migliori, sicurezza elevata, funzioni deprecate: ecco tutte le novità della versione 7.2 di PHP

PHP 7.2 presenta molte novità dal punto di vista della sicurezza, delle implementazioni e funzioni deprecate.
Inoltre introduce un ulteriore incremento delle performance (già nella versione 7 era stato fatto un ottimo lavoro): PHP 7.2 è del 20% più veloce rispetto alla versione 7.0 e del 10% più veloce rispetto alla versione 7.1.

Ecco le principali novità che ci offre questa nuova versione.

Type hinting di un argomento

Fin dalla versione 5 di PHP era possibile specificare il tipo di argomento passato ad una determinata funzione.

Esempio:

class SimpleClass 
{
    public $foo = 'bar';
}

$simpleClass = new SimpleClass;

function test(SimpleClass $simpleClass)
{
    return $simpleClass->foo;
}

echo test($simpleClass);

Fino alla version 7.1 se veniva passato un valore non di tipo SimpleClass alla funzione test veniva generato un errore 500.

Con PHP 7.2 il type hinting di un argomento può essere dichiarato come object, che indica un oggetto generico.

Esempio:

class SimpleClass
{
    public $foo = 'bar';
}

class FirstClass extends SimpleClass
{
    public $foo = 'baz';
}

class SecondClass extends SimpleClass
{
    public $foo = 'foobar';
}

$firstClass = new FirstClass;

$secondClass = new SecondClass;

function test(object $arg)
{
    return $arg->var;
}

echo test($firstClass);

echo test($secondClass);

In questo esempio il codice funziona dichiarando l’argomento di tipo object e quindi un oggetto generico e non genera errore 500.
Inoltre questa funzionalità permette di avere una “varianza” nel tipo che viene implementato nella sottoclasse ad esempio.

Object diventa una parole chiave dalla versione 7.2, quindi assicuratevi di non usarla come nome di classi, interfacce o trait.

Type hinting del valore di ritorno

Dalla versione 7.2 si può dichiarare il type hint del valore di ritorno come object.

Esempio:

function test($arg) :object
{
    return new Foo($arg);
}

Metodi abstract e interfacce sovrascrivibili

PHP 7.2 permette di sovrascrivere metodi abstract e interfacce ovvero possiamo omettere la dichiarazione del tipo di parametro in un metodo abstract esteso dalla classe padre.

Esempio:

abstract class foo
{
    abstract function baz(string $yourVar);
}

abstract class bar extends foo
{
    abstract function baz($yourVar) : int;
}

La stessa funzionalità vale anche per le interfacce, ad esempio:

interface foo
{
    public function test(string $yourVar);
}

class bar implements foo
{
    public function test($yourVar)
    {
        //your code
    }
}

Questa nuova funzionalità permette di aggiornare le classi padre senza dover aggiornare tutte le sottoclassi da esse derivate.

Probabilmente questo è un miglioramento marginale (non sarà usato così spesso).

Virgole nella sintassi alla fine delle liste degli use statement

Una virgola alla fine dell’ultimo elemento di un array è sintassi valida in PHP, e talvolta è incoraggiata per aggiungere facilmente nuovi elementi ed evitare errori di analisi dovuti a una virgola mancante.

Dalla versione 7.2 di PHP possiamo utilizzare le virgole anche per le “use” delle classi.

Esempio:

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

Argon2 nell’hash delle password

Argon2 è un potente algoritmo di hashing che è stato selezionato come vincitore del 2015 Password Hashing Competition, e PHP 7.2 lo introduce come un’alternativa sicura all’algoritmo di Bcrypt.
La nuova versione di PHP introduce la costante PASSWORD_ARGON2I, che ora può essere utilizzata nelle funzioni password_ *, secondo questa sintassi:

password_hash('secretpassword', PASSWORD_ARGON2I);

A differenza di Bcrypt, che richiede un solo fattore, Argon2 considera tre fattori differenti:

  • Un costo di memoria che definisce il numero di KiB da consumare durante l’hashing (i valori predefiniti sono 1 << 10 o 1024 KiB o 1 MiB);
  • Un costo di tempo che definisce il numero di iterazioni dell’algoritmo di hashing (il valore predefinito è 2);
  • Un fattore di parallelismo, che imposta il numero di thread paralleli che verranno utilizzati durante l’hashing (il valore predefinito è 2).

Tre nuove costanti definiscono i fattori di costo predefiniti:

    1. PASSWORD_ARGON2_DEFAULT_MEMORY_COST
    2. PASSWORD_ARGON2_DEFAULT_TIME_COST
    3. PASSWORD_ARGON2_DEFAULT_THREADS

Esempio:

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2];
password_hash('secretpassword', PASSWORD_ARGON2I, $options);

Libsodium come parte di PHP Core

A partire dalla versione 7.2, PHP include la libreria di Sodium nel suo core. Libsodium è una libreria cross-platform e cross-languages per crittografia, decrittografia, firme, hashing delle password e altro ancora.
La libreria era precedentemente disponibile tramite PECL.
PHP 7.2 è il primo linguaggio di programmazione che aggiunge la crittografia moderna alle sue librerie.

Contare valori scalabili

Lo sapevi che è possibile contare i valori scalari? In realtà ciò è trascurabile, in quanto la funzione count() restituisce solo 1 per gli scalari.

Esempio:

var_dump(count(null)); // int(0)
var_dump(count(0)); // int(1)
var_dump(count(4)); // int(1)
var_dump(count('4')); // int(1)

Da PHP 7.2, verrà emesso un avviso:

Warning: count(): Il parametro deve essere un array o un oggetto che implementa Countable in / in / 4aIl2 sulla riga 3.

Nuove funzionalità

PHP 7.2 introduce alcune funzioni nuove che possono tornare molto utili: ftp_append(), hash_hmac_algos(), imagesetclip(), imagegetclip(), imageopenpolygon(), imageresolution(), imagecreatefrombmp(), imagebmp().

php 7.2 quali sono le funzioni deprecate?Funzioni deprecate

La funzione assert() verifica l’asserzione data e prende le azioni appropriate se il risultato è FALSE. L’utilizzo di assert () con argomento stringa è ora deprecato in quanto apre una vulnerabilità RCE.

La funzione __autoload è stata sostituita da spl_autoload_register in PHP 5.1. Ora viene generata una notifica di deprecazione quando viene rilevata durante la compilazione.

La variabile $php_errormsg viene creata nell’ambito locale quando viene generato un fatal error. Dalla versione 7.2 dovrebbero essere utilizzati error_get_last e error_clear_last.

create_function() consente la creazione di una funzione con un nome di funzione generato, un elenco di argomenti e il codice del corpo forniti come argomenti. A causa di problemi di sicurezza e prestazioni inadeguate, è stato contrassegnato come deprecato (l’uso di enclosure è invece consigliato).

each() è usato per iterare su un array molto simile a foreach () che risulta essere 10 volte più veloce.

$errcontext è un array contenente le variabili locali esistenti al momento della generazione di un errore.

gmp_random() è considerato dipendente dalla piattaforma e sarà deprecato. È consigliato usare invece gmp_random_bits () e gmp_random_rage ().

Per mbstring.func_overload, l’impostazione ini impostata su un valore diverso da zero è stata contrassegnata come deprecata.

parse_str() analizza una stringa di query in un array se viene fornito il secondo argomento o nella tabella dei simboli locale se non viene utilizzata. Dato che dinamicamente l’impostazione di variabili nell’ambito della funzione è scoraggiata per motivi di sicurezza, l’uso di parse_str() senza il secondo argomento genererà un avviso di deprecazione.

(unset)cast è un’espressione che restituisce sempre null ed è considerata inutile.

Per ulteriori approfondimenti contattatemi o seguitemi su:
Twitter
GitHub

Alessandro Minoccheri
Written by Alessandro Minoccheri