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

Le novità di PHP 5.5

Tutte le novità di PHP 5.5, la nuova versione del più utilizzato linguaggio di programmazione sul Web
Tutte le novità di PHP 5.5, la nuova versione del più utilizzato linguaggio di programmazione sul Web
Link copiato negli appunti

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.

Ti consigliamo anche