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()
, un’implementazione alternativa della funzione range()
; nativamente quest’ultima ha il compito di generare un array contenente un intervallo di elementi, in alcuni casi tale vettore potrebbe richiedere un’ingente quantità di risorse per la sua archiviazione, rendendo impegnative le procedure per processarlo se non addirittura raggiungendo il limite di memoria consentito dall’ambiente di sviluppo.
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()
in foreach
Un’altra novità di PHP 5.5 riguarda il supporto del costrutto list()
nei cicli basati sulla struttura di controllo foreach; list()
non è propriamente una funzione, ma uno strumento che permette di assegnare variabili utilizzando i valori contenuti in un array, esso accetta come parametri le variabili a cui assegnare i valori e il vettore da cui prelevare questi ultimi. Un semplice esempio di uso di list()
in foreach potrebbe essere il seguente:
<?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
verranno attribuiti i valori con chiavi “0” e “2” (cioè “1” e “3”), mentre alla variabile $pari quelli con chiavi “1” e “3” (cioè “2” e “4”).
Espressioni arbitrarie in empty()
In PHP una variabile viene considerata vuota se non esiste o se vale FALSE, tale stato può essere verificato attraverso la funzione empty() che svolge un’azione equivalente a !isset($var) || $var == false
. Prima della versione 5.5, empty()
supportava unicamente argomenti sotto forma di variabili, dando luogo ad errori di parsing nel caso del passaggio di parametri di natura differente; quindi, l’esecuzione delle seguenti istruzioni in un ambiente basato sulla release 5.4.x, o precedente, avrebbe portato ad una notifica da parte di PHP:
<?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()
, l’output dello script sarà invece:
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()
Tra le nuove funzioni dell’ultimo aggiornamento vi è anche boolval()
,
appositamente introdotta per rilevare il valore booleano di una variabile. Essa
accetta come parametro la variabile da verificare e permette di gestire varie
tipologie di dati, ad esempio, la seguente espressione basata sull’operatore
ternario:
<?php
echo '"HTML.it": '.(boolval("HTML.it") ? 'true' : 'false')."n";
?>
restituirà true in quanto l’informazione passata come argomento (“HTML.it")
è reale in termini booleani, mentre:
<?php
echo '0: '.(boolval(0) ? 'true' : 'false')."n";
?>
restituirà false in quanto FALSE
è il corrispondente di “0" in termini
booleani. È da sottolineare che tale funzione non è destinata a confronti di
identità tra valori o a verifiche sui tipi di dato.
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.