Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP 7.3, tutte le novità

Analizziamo una per una tutte le principali novità della versione 7.3 di PHP.
Analizziamo una per una tutte le principali novità della versione 7.3 di PHP.
Link copiato negli appunti

L'attesissima versione 7.3 del linguaggio di scripting server-side più utilizzato al Mondo è ormai dietro l'angolo, arriverà plausibilmente a dicembre portando con se nuove funzionalità, ma anche elementi deprecati ed un buon numero di bug corretti. Di seguito tutte le novità principali del rilascio.

Sintassi heredoc e nowdoc maggiormente flessibile

La sintassi heredoc consente di stampare un testo senza dover applicare escape, ad esempio tramite i doppi apici. Un'operazione che risulta invece necessaria utilizzando le comuni funzionalità di stampa del linguaggio. La sintassi heredoc inizia con un "<<<", seguito da un marker scelto dallo sviluppatore, e si conclude con lo stesso marker seguito da un punto e virgola. All'interno va posizionato il testo da stampare:

print <<<EOT
testo di grandi dimensioni che non necessita di escape
EOT;

La sintassi nowdoc si comporta esattamente come la precedente, con la differenza che il marker va delimitato tra apici singoi e non viene effettuato alcun parsing.

print <<<'EOT'
testo di grandi dimensioni che non necessita di escape
EOT;

Con la versione 7.3 arrivano alcune migliorie nella digitazione delle sintassi heredoc e nowdoc. Se con PHP 7.2 non era possibile indentare il marker di chiusura, ora sarà possibile farlo senza preoccuparsi degli spazi, che saranno rimossi dal motore di PHP. Vediamo la differenza:

# Sintassi PHP 7.2
class myClass {
    public $myVar = <<<EOT
myVarValue
EOT;
}

# Sintassi PHP 7.3
class myClassName {
    public $myVar = <<<EOT
        myVarValue
    EOT;
}

Inoltre, se prima era richiesta una break line dopo la chiusura del marker per terminarlo, ora non è più necessaria.

Ci sono tuttavia dei parametri da rispettare per non incorrere in errori del parser, come:

Parse error: Invalid body indentation level (expecting an indentation at least ...) in %s on line %d

L'indentatura del marker non deve mai superare quella del testo nel corpo del blocco. Possiamo poi indentare sia utilizzando spazi che tabulazioni, non è però possibile utilizzarle entrambe contemporaneamente. Occorre invece impiegare lo stesso tipo di indentazione sia per il marker di chiusura che per le linee del testo.

Trailing commas nelle funzioni

Qualunque sviluppatore è incorso in un errore di parsing dovuto ad una virgola mancate o aggiuntiva. PHP ha permesso l'uso delle "trailing commas" o virgole trascinate nella dichiarazione degli array, nel seguente modo:

$data = array(
   'username' => $user->getUsername(),
   'userpass' => $user->getPassword(),
   'email' => $user->getEmail(),
);

L'ultima riga viene chiusa da una virgola anche se non ci sono altre righe nell'array, e questa sintassi è perfettamente legale. Ora, possiamo utilizzare le trailing commas anche con le funzioni, nella fase di chiamata:

unset(
    $myvar,
    $myvar2,
    $myvar2,
);
isset(
    $myvar,
    $myvar2,
    $myvar3,
);
$newArray = array_merge(
$arrayOne,
$arrayTwo,
['myvar', 'myvar2'],
);

e questa funzionalità risulta molto utile nel debugging:

var_dump(
    $myvar,
    $myvar2,
    $myvar3,
);

La stessa sintassi è utilizzabile richiamando i metodi. Tuttavia questa possibilità riguarda solo la fase di chiamata delle funzioni e non la loro dichiarazione.

JSON_THROW_ON_ERROR: gestione degli errori nelle funzioni json

Una delle funzionalità più richieste della versione 7.3 è quella che riguarda la modalità di gestione degli errori JSON. Non è una feature del Core, ma proviene dall'estensione JSON che modifica il comportamento degli errori nelle funzioni json_decode() e json_encode().

Prima di PHP 7.3 json_decode() restituiva null in caso di errore, ma null può essere, nel contesto dell'applicazione, un valore assolutamente non indicativo di un errore. E' dunque possibile riconoscere con esattezza l'errore solo richiamando json_last_error() o json_last_error_msg() che restituiscono rispettivamente l'errore globale in formato "machine-readable" e "human-readable".

json_encode() restituisce invece FALSE in caso di errore. Sebbene possa essere più descrittivo rispetto a null, anche in questo caso l'esecuzione del programma non viene alterata né viene prodotta un'eccezione.

Abbiamo ora a disposizione un nuovo flag, da utilizzare come parametro delle funzioni json_decode() e json_encode(), chiamato JSON_THROW_ON_ERROR. Quando utilizzato esso permette di modificare il comune comportamento della gestione degli errori con tali funzioni, generando un'eccezione di tipo JsonExeption. Ora non possiamo più avere risultati ambigui nella gestione degli errori sul parsing JSON, perché è possibile gestire elegantemente l'errore con il blocco try/catch:

try {
    json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (\JsonException $exception) {
    echo $exception->getMessage(); // produce "Syntax error"
}

Riferimento per list()

In PHP possiamo assegnare un valore per riferimento:

$varB = &$varA;

In questo caso $varB assume il valore di $varA, ma non tramite copia di valore. Ciò che accade è che entrambe le variabili puntano alla stessa locazione di memoria, quindi cambiando il valore di una delle due cambierà anche il valore dell'altra:

$varB = &$varA;
$varA = 10;// stampa 10
echo $varB;
$varB = 20;// stampa 20
echo $varA;

list() viene utilizzata per assegnare valori alle variabili come se fossero elementi di un array, ma prima di PHP 7.3 è possibile eseguire tale operazione solo per valore. Con la versione 7.3 sarà ora possibile assegnare i valori per riferimento attraverso list():

$myarray = [1, 2];
list($varA, &$varB) = $myarray;

che è la stessa cosa del seguente snippet:

$myarray = [1, 2];
$varA = $myarray[0];
$varB =& $myarray[1];

Funzione is_countable()

Fino a PHP 7.2, usando la funzione count() su elementi non contabili (uncountable), si otteneva un errore. Per questo motivo dovevamo scrivere qualcosa del genere:

if (is_array($myvar) || $myvar instanceof Countable) {
    // $myvar is countable
}

Con la funzione is_countable(), che restituisce TRUE nel caso in cui la variabile è contabile (come un array) o FALSE se non lo è, sarà possibile scrivere:

if (is_countable($myvar)) {
    // $myvar is countable
}

array_key_first, array_key_last

E' possibile recuperare il primo e l'ultimo elemento di un array utilizzando le funzioni reset(), end() e key(). Tuttavia con esse non c'è modo di raccogliere "l'indice" dell'elemento su cui si sta lavorando senza modificarne lo stato. Per questo motivo, PHP 7.3 aggiunge le funzioni array_key_first() e array_key_last() che permettono rispettivamente di recuperare il primo e l'ultimo valore dell'indice (key) di un array senza intaccare il puntatore interno dell'array.

Argon2 migliorato

L'algoritmo di hashing chiamato Argon2 implementato in PHP 7.2 è un'alternativa a Bcrypt. Le migliorie riguardano:

  • Argon2d aumenta la resistenza ai cracking della GPU. Più veloce, utilizza l'acceso alla memoria dipendente dai dati.
  • Argon2i: usa lo stesso accesso alla memoria, la modalità preferita per l'hashing di password. Soluzione più lenta, data dai maggiori passaggi in memoria.
  • Argon2id versione ibrida che combina l'approccio di Argon2i, per il primo passaggio sulla memoria, e l'approccio di Argon2d per i passaggi seguenti.

Nelle funzioni password_ viene implementato Argon2id tramite la costante PASSWORD_ARGON2ID:

password_hash('password', PASSWORD_ARGON2ID);

L'implementazione è identica a quella di Argon2i, accettando i seguenti fattori:

  • memory cost: definisce il numero di KB che dovrebbe essere utilizzato durante l'hashing (valori di default 1<<10 o 1024KB o 1MB).
  • time cost: definsice il numero delle iterazioni dell'algoritmo di hashing (di default 2).
  • parallelism: setta il numero di thread paralleli che verranno utilizzati durante l'hashing (di default 2).

Elementi deprecati: costanti case-insensitive

PHP ha supportato da sempre le costanti nelle versioni case-sensitive e case-insensitive. Dato che queste ultime sono considerate soggette ad inconsistenze, sono state prese le seguenti misure:

  • le costanti delle classi sono sempre case-sensitve;
  • le costanti globali dichiarate con const sono sempre case-sensitive;
  • le costanti definite con la funzione define() sono case-sensitve di default.

Ti consigliamo anche