PHP 5.4 è stato rilasciato nella serata americana di ieri dal team di sviluppo del linguaggio. In attesa del rilascio di PHP 6, atteso da tempo ma che ad oggi sarebbe ancora bel lontano dall'essere completato, PHP 5.4.0 è dunque l'ultima versione disponibile del noto linguaggio per lo scripting server side. Gli sviluppatori del core avevano programmato l'integrazione di numerose nuove caratteristiche per questo aggiornamento, alcune sono state effettivamente inserite, per altre si dovranno invece attendere i rilasci successivi.
Nello specifico, le novità più importanti che porta con se PHP 5.4.0 sono le seguenti:
- traits : introducono in PHP l'ereditarietà orizzontale nel linguaggio attraverso collezioni di metodi riutilizzabili tra classi;
- un server HTTP integrato: per la prima volta PHP mette a disposizione un proprio piccolo server Web utilizzabile tramite CLI (Command Line Interface) e per finalità legate ai test in sede di sviluppo;
- nuova sintassi con abbreviazione per gli array e dereferenziazione dei vettori (Array dereferencing);
- funzioni anonime con supporto per il
$this
per l'accesso alle proprietà degli oggetti; - eliminazione di alcune funzionalità, come per esempio "magic quotes", già deprecate nella versione 5.3.0.
Nel corso di questa trattazione verrà presentata una breve introduzione delle novità di PHP 5.4.0 ed elencate alcune funzionalità assenti che, non essendo state approvate dagli sviluppatori del core, non sono state rese disponibili con questo rilascio.
I traits
Numerosi sviluppatori considerano i traits come una delle novità più interessanti tra quelle introdotte con PHP 5.4.0, questi nuovi strumenti non sarebbero stati accolti però con unanime entusiasmo, in quanto interpretati da alcuni come un tentativo macchinoso di dotare PHP di una sorta di eredità multipla ma con le forti limitazioni dovute all'architettura di base del linguaggio.
Nello specifico i traits rappresentano delle collezioni di metodi, o più semplicemente delle porzioni di sorgente recanti metodi, riutilizzabili tra le classi; da qui il riferimento all'eredità orizzontale, in quanto in traits possono esse utilizzati orizzontalmente tra le classi; tecnicamente è possibile dire che i traits costituiscono un sistema per il riutilizzo del codice nei linguaggi ad ereditarietà singola (single inheritance) come PHP.
Altri linguaggi, in particolare di programmazione e basati sul paradigma dell'OOP, mettono a disposizione il meccanismo dell'eredità multipla, grazie ad esso è possibile generare una classe che erediti i comportamenti e le caratteristiche di più classi principali; in PHP questo meccanismo è assente o, per meglio dire, non supportato, i traits sono stati quindi introdotti per fornire degli strumenti alternativi definibili tramite le stesse procedure previste per le classi o le interfacce e che fossero in grado di ricomprendere qualsiasi metodo di cui lo sviluppatore avesse necessità; nel momento in cui verrà generata una nuova classe, essa potrà riutilizzare i metodi collezionati nei traits.
Il semplice esempio proposto di seguito mostra un possibile utilizzo dei traits e della sintassi necessaria per la loro adozione:
<?php
// definizione della classe principale
class Nome {
public
function getNome() {
echo 'Html';
}
}
// definizione di un trait
trait Estensione {
public
function getNome () {
parent:: getNome ();
echo '.it';
}
}
// definizione di una sottoclasse che eredita dalla classe base
class NomeAdominio extends Nome {
use Estensione;
}
// istanza della classe derivata
$obj = new NomeAdominio();
// chiamata al metodo
$obj-> getNome();
?>
Il codice proposto, la cui esecuzione porterà alla stampa della stringa "Html.it", mostra innanzitutto la definizione di una classe base (nel caso specifico Nome
) all'interno della quale è presente un metodo con livello di visibilità public e quindi accessibile anche esternamente alla classe; segue un trait (Estensione
) e quindi una classe derivata (NomeAdominio
); getNome()
è invece un metodo ereditato dalla classe base che, attraverso la chiamata al trait operata tramite use
, subisce un override dal metodo presente nella sotto-classe, cioè una riscrittura del metodo ereditato.
Web Server integrato
L'introduzione di un server Web integrato in PHP 5.4.0 risponde all'esigenza di velocizzare il lavoro degli sviluppatori in fase di test delle applicazioni; non si tratta di un'applicazione concepita per essere utilizzata in fase di produzione, essa rappresenta invece un'alternativa più immediata, ed estremamente meno bisognosa di configurazioni, ad Apache e altri server HTTP.
Il Web server integrato di PHP è utilizzabile tramite istruzioni da linea di comando, per cui sarà possibile lanciarlo tramite un comando come il seguente:
$ cd ~/public_html
$ php -S localhost:8000
si avrà così una risposta di questo genere da parte del Web server:
PHP 5.4.0 Development Server started at ...
Listening on localhost:8000
Document root is /home/claudio/public_html
Press Ctrl-C to quit
Sarà inoltre possibile far partire l'applicazione specificando una document root directory sulla base del progetto corrente, a questo scopo si potrà utilizzare un'istruzione sul modello delle seguenti linee di comando:
$ cd ~/public_html
$ php -S localhost:8000 -t miei_file/
in questo caso la risposta del Web server sarà simile a:
Document root is /home/claudio/public_html/miei_file
Va da sé che, anche se nato esclusivamente per essere utilizzato in ambito di sviluppo, nulla vieta di utilizzare il Web server integrato in PHP per la creazione di piccole Web application destinate all'utilizzo locale.
Sintassi abbreviata per gli array e dereferenziazione
PHP 5.4.0 introduce una sintassi abbreviata per gli array, siano essi numerici o associativi, come nell'esempio seguente:
<?php
$a = [9, 11, 13];
$b = ['giuseppe' => 'garibaldi', 'dante' => 'alighieri', 'victor' => 'ibarbo'];
echo $a[0];
echo '<br />';
echo $b['giuseppe'];
?>
La nuova sintassi per gli array è stata uno degli argomenti più discussi nella comunità che si raccoglie attorno al linguaggio; tutto è nato per via della grande popolarità assunta dal formato JSON per l'interscambio di dati serializzati e della richiesta di introdurre in PHP una sintassi per i vettori sul modello di quest'ultimo. Al momento di votare le nuove funzionalità, molti sviluppatori del core si sarebbero opposti a tale proposta, mentre numerosi utilizzatori avrebbero manifestato di essere favorevoli.
La dereferenziazione degli array è invece un'operazione che consente di assegnare un valore ad un elemento di un array. In pratica questa nuova funzionalità permette di dereferenziare un array che costituisce il valore di ritorno di una funzione accedendo in modo diretto agli elementi che lo compongono e senza la necessità di dover passare il vettore come informazione ad una variabile.
Un semplice esempio di array dereferencing potrebbe essere il seguente:
<?php
function dereferenziazione() {
return array('php', 'perl', 'python');
}
echo dereferenziazione()[0];
?>
L'esecuzione della funzione definita in esempio porterà alla stampa del primo valore in array in quanto ad esso è associato l'indice numerico "0", lo stesso meccanismo è valido anche per gli array associativi utilizzando per ogni elemento l'indice associato; la dereferenziazione potrà essere utilizzata anche nelle closures per la definizione di funzioni anonime ottenendo il medesimo risultato:
<?php
$dereferenziazione = function() {
return array('php', 'perl', 'python');
};
echo $dereferenziazione()[0];
?>
Nonostante la sua evidente comodità in sede di digitazione del codice, anche in questo caso non sarebbero mancate alcune resistenze all'introduzione di questa nuova funzionalità, in particolare essa sarebbe stata criticata perché, secondo alcuni sviluppatori, renderebbe il codice meno leggibile e potrebbe consentire il passaggio di valori inattesi.
$this nelle closures
Un'altra novità interessante di PHP 5.4.0 è l'introduzione del supporto per il $this
nelle closures che fornisce la possibilità di accedere a tutte le proprietà degli oggetti, abbiano essi livello di visibilità public o meno; un semplice esempio riguardante l'utilizzo di questa funzionalità potrebbe essere il seguente:
<?php
// definizione della classe
class MyClass {
// variabile con visibilità private
private $var = 222;
// prima funzione
function pippo($x) {
// closure
return
function() use ($x) {
// valore di ritorno
return $this->$x;
}
;
}
// seconda funzione
function pluto() {
return
function($x) {
return $this->$x;
}
;
}
}
// istanza della classe
$obj = new MyClass();
// accesso alle proprietà dell'oggetto
$pippo = $obj->pippo('var');
echo $pippo();
echo '<br />';
$pluto = $obj->pluto();
echo $pluto('var');
?>
Tale funzionalità era stata inizialmente pensata per PHP 5.3, fu poi però rimossa perché gli sviluppatori del core di PHP non trovarono un accordo comune su come essa dovesse essere implementata.
Funzionalità non incluse in PHP 5.4.0 e rimosse
Nonostante le attese, nell'ultima versione di PHP non sono state integrate le seguenti funzionalità:
-
Annotations: rappresentano una modalità per l'inserimento di metadati all'interno del sorgente, in questo modo le informazioni relative ai metadati possono essere utilizzare per la generazione di codice di supporto che non dovrà essere prodotto manualmente;
-
Estensione per il caching APC: una soluzione per il problema relativo all' overhead (richiesta di risorse accessorie) durante il processo di compilazione opcode (codice operativo), la sua introduzione è richiesta in particolare per le applicazioni che devono gestire elevati livelli di traffico.
Tra le funzionalità rimosse con PHP 5.4.0 rispetto alle versioi precedenti è possibile segnalare:
-
magic quotes per l'escape automatico dei valori passati tramite query SQL;
-
sintassi break/continue per le variabili nei cicli;
-
safe mode, già deprecato in PHP 5.3, e relative direttive;
-
direttive register_globals e register_long_arrays;
-
opzione allow_call_time_pass_reference.
Per una lista completa delle funzionalità integrate e rimosse da questa release è possibile consultare il changelog ufficiale.
Conclusioni
Quello di PHP 5.4.0 rappresenta un rilascio particolarmente importante per PHP in quanto porta con sé alcune novità interessanti come per esempio i traits
per il riutilizzo dei metodi tra classi, un Web Server intergrato, una nuova sintassi per gli array e nuovi strumenti per vettori e closures.
Nel corso di questa trattazione sono state descritte le nuove caratteristiche disponibili ed elencate quelle che non sono state incluse nella versione o sono state rimosse con il suo rilascio.