Ieri è stata rilasciata la prima versione Beta della futura versione di PHP. PHP 5.5 presenta numerose novità sia dal punto di vista delle funzionalità addizionali che per quanto riguarda le incompatibilità e le features divenute deprecate rispetto alle versioni precedenti. In questa breve trattazione verrà proposta una panoramica dei nuovi strumenti disponibili dopo l’upgrade e delle modifiche apportate con tale rilascio.
I generators
Con PHP 5.5 il linguaggio integra il supporto per i generators che diventano accessibili tramite la parola chiave yield
; attraverso di essi si disporrà di una modalità semplice ed immediata per l’implementazione di costrutti finalizzati all'iterazione, evitando in questo modo il verificarsi di overhead (richieste per risorse accessorie) così come la necessità di ricorrere ad una classe che implementi l’interfaccia Iterator.
Nel caso specifico, un generator permetterà di digitare sorgenti in cui il ciclo foreach viene adottato per iterare dataset evitando l’allocazione di un array in memoria; in pratica esso lavora come una qualsiasi altra funzione se non per il fatto un generator potrà ripetersi tante volte quante quelle necessarie per la restituzione di tutte le iterazioni previste. Un esempio riguardante il funzionamento di questo costrutto potrebbe essere il seguente:
<?php
function newrange($inizio, $fine, $intervallo) {
for ($x = $inizio; $x <= $fine; $x += $intervallo) {
// valore di ritorno
yield $x;
}
}
foreach (newrange(100, 900, 100) as $risultato) {
echo $risultato . " ";
}
?>
Nel caso del codice proposto, il cui output sarà:
100 200 300 400 500 600 700 800 900
è stato introdotto il generator newrange()
range()
Nel momento in cui si effettua una chiamata ad un generator esso fornisce un oggetto iterabile, il parser del linguaggio chiamerà la relativa funzione ogni volta che si renderà necessario un valore e memorizzerà lo stato corrente del generatore, in questo modo il ciclo potrà essere ripreso con la richiesta del valore successivo e così via fino all’ultima delle iterazioni possibili
Supporto per finally nella gestione delle eccezioni
Come è noto, con PHP 5 venne introdotto un modello per la gestione delle eccezioni, mutuato da altri linguaggi, che prevede l’utilizzo di blocchi try/catch; in esso try
prova ad eseguire una o più istruzioni, throw
istanzia l’oggetto Exception
per l’eventuale gestione delle eccezioni e catch
ha il compito di eseguire un’istruzione alternativa (ad esempio la notifica dell’eccezione stessa). Con il rilascio di PHP 5.5 è possibile specificare un ulteriore blocco, finally
, destinato a contenere codice che dovrà essere eseguito a prescindere dall’esito delle istruzioni previste attraverso try/catch. Per fare un esempio, si pensi al classico errore di divisione di un valore numerico per zero, fino a PHP 5.4.x esso sarebbe stato gestibile nel modo seguente:
<?php
$x = 5;
$y = 0;
try{
if ($y == 0){
throw new Exception("Divisione per zero.");
}else{
echo $x/$y;
}
}
catch (Exception $e)
{
echo "Eccezione rilevata: ", $e->getMessage(), "n";
}
?>
Una volta rilevata l’eccezione, l’esito dell’esecuzione sarebbe stato il seguente output:
Eccezione rilevata: Divisione per zero.
In PHP 5.5 si potrà invece aggiungere subito dopo try/catch un ulteriore blocco espresso sul modello del seguente:
finally
{
echo "Questa istruzione deve essere eseguita in ogni caso.";
}
Esso permetterà di introdurre un nuovo comportamento (nell’esempio un output addizionale) non vincolato alla gestione prevista per l’eccezione e produrrà l’output ad esso associato prima del ritorno da parte dell’applicazione alla normale esecuzione delle istruzioni successive.
Supporto per list()
list()
list()
list()
<?php
$numeri = [
[1, 2],
[3, 4],
];
foreach ($numeri as list($dispari, $pari)) {
echo "X: $dispari - Y: $pari.<br />n";
}
?>
L’effetto delle assegnazioni sarà visibile immediatamente tramite l’output dello script:
X: 1 - Y: 2.
X: 3 - Y: 4.
In pratica l’assegnazione dei valori avviene a partire da quello associato alla chiave “0” per poi proseguire in ordine crescente, per cui alla variabile $dispari
Espressioni arbitrarie in empty()
!isset($var) || $var == false
empty()
<?php
function vero_o_falso() {
return false;
}
if(empty(vero_o_falso())) {
echo “Vero.”;
}
if (empty(true)) {
echo “Falso.”;
}
?>
In PHP 5.5, che supporta il passaggio di espressioni come argomenti ad empty()
Vero.
In quanto la funzione definita dall’utente genererà un (non) valore di ritorno pari a false
Deferenziazione di array e string literals
La Dereferenziazione (Dereferencing) di array e string literals
(rappresentazioni dei valori stringa) consente di effettuare l’accesso diretto
ad elementi specifici; per cui, nel caso degli array, si potrà per esempio
effettuare un’operazione come la seguente:
<?php
echo [10, 20, 30][0];
?>
l’output dello script sarà uguale a “10" in quanto questo è appunto il valore
associato alla chiave “0" all’interno dell’array; tale meccanismo potrebbe
ricordare quello già introdotto in PHP 5.4 con l’array
dereferencing in stile JSON che
consentiva dereferenziare un array quale valore di ritorno di una funzione, ma
rappresenta una sua evoluzione ed è supportato solo in PHP 5.5 (nella versione
5.4.x darebbe luogo ad un errore di parsing). Per quanto riguarda le stringhe,
si potranno effettuare dereferenziazioni utilizzando un metodo molto simile a
quello già proposto per i vettori:
<?php
echo "HTML.it"[0];
?>
L’output dello script sarà “H" in quanto i caratteri della stringa vengono
associati singolarmente a chiavi numeriche ordinate da “0" ad “n", quindi,
nell’esempio proposto “H" avrà chiave “0", la prima “T" chiave “1" e così via
fino alla “t" finale con chiave “6".
La nuova API per il password hashing
PHP 5.5 presenta una nuova interfaccia di programmazione per il password
hashing, si tratta in pratica di un wrapper per la funzione crypt()
che
restituisce stringhe cifrate tramite l’algoritmo per Unix basato sul Data
Encryption Standard o un omologo disponibile attraverso il sistema di
riferimento. Nel quadro di tale innovazione si inserisce la funzione
password_hash()
che ha appunto il compito di creare una nuova password hash,
essa accetta come argomenti la password decriptata, una costante riferita
all’algoritmo utilizzato (PASSWORD_BCRYPT
o in alternativa
PASSWORD_DEFAULT
) e
le opzioni cost
e salt
. Un semplice esempio di utilizzo della funzione potrebbe
essere il seguente:
<?php
echo password_hash("HTML.it", PASSWORD_DEFAULT)."n";
$parametri = [
'cost' => 7,
'salt' => 'cfEnf3d4x9D1M53rtWd5dg',
];
echo password_hash("HTML.it", PASSWORD_BCRYPT, $parametri)."n";
?>
Lo script darà luogo a un output composto da due stringhe sul modello di
quelle proposte di seguito:
$2y$10$RZjT7UYXe2ijKNEZZD9ifeVfeGauatl67IHGisRlS8alYdRl0EOtm $2y$07$cfEnf3d4x9D1M53rtWd5deaYKCmklwj04ysMlK93rDc4wPOJBcxVW
La costante PASSWORD_DEFAULT
indica che dovrà essere utilizzato l’algoritmo
predefinito in mancanza di un’indicazione differente, mentre PASSWORD_BCRYPT
viene passato alla funzione per la generazione di un hash basato sull’algoritmo
CRYPT_BLOWFISH
; l’opzione (o fattore) cost specifica la quantità di cicli di
algoritmo che dovranno essere eseguiti prima della produzione della stringa di
output, mentre salt è una sequenza casuale introdotta per rendere più
difficoltosa la violazione della password.
La funzione boolval()
boolval()
<?php
echo '"HTML.it": '.(boolval("HTML.it") ? 'true' : 'false')."n";
?>
restituirà true
<?php
echo '0: '.(boolval(0) ? 'true' : 'false')."n";
?>
restituirà false
FALSE
Incompatibilità e funzionalità deprecate
In buona parte PHP 5.5 garantisce un soddisfacente livello di
retrocompatibilità con le versioni precedenti del linguaggio, vi sono però
alcuni aspetti che dovranno essere tenuti in considerazione prima di eventuali
migrazioni. Innanzitutto, con questa release non viene più garantito il supporto
per Windows XP e Windows 2003, per cui se si intende lavorare su una piattaforma
della Microsoft si dovrà disporre come minimo di Windows Vista. In secondo
luogo, l’originale estensione MySQL del linguaggio è da considerarsi deprecata,
ciò significa che d’ora in poi per i propri progetti sarà necessario valutare
l’uso di soluzioni alternative come MySQLi o PDO; l’eventuale utilizzo della
MySQL extension porterebbe alla notifica di errori E_DEPRECATED in connessione
con il DBMS.
Conclusioni
Con PHP 5.5 vengono introdotte alcune novità a livello di costrutti, di
supporto per i sistemi operativi e di funzionalità deprecate; in questa
trattazione sono state descritte le caratteristiche più rilevanti del rilascio,
un’eventuale consultazione del manuale ufficiale del linguaggio
(http://www.php.net/manual/en/migration55.php) permetterà di approfondire gli
argomenti trattati riguardo alle modifiche meno rilevanti apportate
dall’aggiornamento.