Introduzione
Il linguaggio di programmazione serverside Php sta facendo passi da gigante: è ormai da molto tempo disponibile il primo modulo per diffusione installato su server apache (a sua volta il primo server). E pensare che il progetto Php era nato come un semplice supporto per facilitare l'utilizzo di cgi. Anche il significato del nome è cambiato, passando da "Personal home page" a "PHP: Hypertext processor" e facendo quindi ben comprendere il profondo cambiamento subito da questo splendido linguaggio. Il primo grande cambiamento si ebbe con la nascita della versione 3, la prima versione a larga diffusione. Poi venne rilasciata la versione 4 con la grande rivoluzione: la nascita dello Zend Engine.
Anche la nascita del progetto pear, arrivato recentemente ad una release stabile, ha fatto ben comprendere la direzione che sta prendendo il Php: si sta affermando come linguaggio di programmazione anche per progetti medio/grandi.
Ed eccoci arrivati all'ultima rivoluzione in linea cronologica: l'introduzione dello Zend Engine 2 e il rilascio di Php 5. Purtroppo ancora non si conosce una data certa per il rilascio, ma si parla della fine dell'anno. Fondamentalmente i cambiamenti introdotti dal nuovo motore Zend (e dalla nuova release del php) puntano a migliorare notevolmente il supporto per la programmazione ad oggetti del Php imitando in parte i concetti espressi da java.
I retroscena: come verranno gestiti gli oggetti
Attualmente la gestione degli oggetti in Php è alquanto macchinosa e embrionale: non esistono metodi distruttori, non si possono importare caratteristiche da più di una classe (o da interfacce), non si può decidere la visibilità delle variabili. Inoltre una variabile contenente un oggetto viene gestita esattamente come una qualunque altra variabile di tipo testuale o numerico, pur essendo la differenza evidente e notevole.
Php5 introduce una grossa novità in questo senso, gestendo gli oggetti come degli indici di una tabella. Vediamo di chiarire questo punto: lo zend engine si occuperà di creare una specie di tabella in cui porre gli oggetti (non le classi. Gli oggetti!) associandoli ad indici numerici e quando verrà passato un oggetto ad una funzione, invece di passare una copia dell'oggetto verrà passato semplicemente l'indice numerico a cui fare riferimento. In sostanza sarà come usare ogni volta il simbolo & per indicare il passaggio per riferimento. Ad esempio usando questo codice:
<?php
class persona{
var $nome = '';
var $cognome = '';
function persona($n, $c){
$this->nome = $n;
$this->cognome = $c;
}
function setNome($n){
$this->nome = $n;
}
function print(){
return $this->nome . ' ' . $this->cognome;
}
}
function nomemaiuscolo($persona){
$persona->setNome(strtoupper($persona->nome));
}
$p = new persona('Mario', 'Rossi');
print $p->print();
nomemaiuscolo($p);
print $p->print();
?>
Con php4 otteniamo questo output:
Mario Rossi
Mario Rossi
Mentre con php5, l'output sarà il seguente:
Mario Rossi
MARIO Rossi
Che cosa cambia? Semplicemente l'oggetto è stato passato per riferimento e quindi le modifiche avvenivano direttamente sull'oggetto e non su una copia del suo contenuto. Questo porta ad un sensibile aumento delle performances della programmazione ad oggetti in quanto l'interprete deve soltanto passare un intero piuttosto che copiare tutto il contenuto dell'oggetto per poi passarlo alla funzione. Sembra strano ma gran parte dei colli di bottiglia o degli errori causati dalla programmazione ad oggetti dipendono dal passaggio per valore e non per riferimento.
Visibilità dei metodi e delle variabili
Così come già avviene in altri linguaggi di programmazione progettati per funzionare ad oggetti, come ad esempio java, sarà possibile decidere se rendere una variabile o un metodo privato, pubblico o protetto.
- Privato: il metodo o la variabile è accessibile solamente da metodi interni alla classe
- Protetto: il metodo o la variabile è accessibile dai metodi della classe o di classi da essa derivate
- Pubblico: il metodo o la variabile è accessibile anche dall'esterno della classe
Inoltre è possibile imitare il modificatore "final" del java per dichiarare una variabile costante con il modificatore "const".
Questo rende la variabile una costante particolare diversa dalle comuni costanti dichiarate con define.
<?php
class test{
const FRASE = 'Frase costante';
}
echo test::FRASE;
?>
Da notare l'utilizzo di questo tipo particolare di costanti. Non è possibile invece inizializzare la classe e usare la costante come una variabile comune:
<?php
class test{
const FRASE = 'Frase costante';
}
$t = new test();
echo $t->FRASE; // non funzionerà
?>
Astrazione e interfacce
Un'altra novità attesa dagli sviluppatori abituati a progettare ad oggetti è l'introduzione del modificatore "abstract". In questo modo è possibile creare sistemi anche abbastanza complessi assicurandosi che ci sia un interfaccia esterna comune.
Questo può rendersi molto utile ad esempio per gestire diveri tipi di output creando una classe per l'output in html, una per quello in Pdf o in html stampabile ed usare un parametro passato via get per decidere quale usare.
Così come in java se una classe ha anche soltanto un metodo "abstract" allora l'intera classe deve essere dichiarata "abstact" e implementata da un'altra classe prima di poterne usare gli altri metodi.
Try/Catch: nuova gestione degli errori
Veniamo all'aggiunta probabilmente più attesa: un nuovo sistema di gestione degli errori.
È stato ripreso il sistema utilizzato da altri linguaggi di programmazione come java o python, quello del try/catch. In sostanza si definisce un blocco in cui potrebbero essere presenti errori e ci si prepara a intercettarli e gestirli di conseguenza.
La sintassi è la seguente:
try{
//codice che potrebbe generare errori
}
catch(NomeClasseEccezione $var){
//gestione dell'errore
}
Dove NomeClasseEccezione è il nome della classe di eccezione o di una classe da cui è derivata (per cui specificando la classe Exception verranno intercettate tutte le eccezioni), e all'interno del blocco catch è possibile accedere alla classe eccezione attraverso la variabile $var.
Nel blocco try è possibile generare l'eccezione direttamente attraverso il costrutto throw oppure è possibile che l'eccezione venga generata da un'altra classe all'interno del blocco.
Questa gestione degli errori è molto più pulita e lineare di una gestione personalizzata degli errori attraverso codice di errore interni alla classe.
Costruttori e distruttori
Con il rilascio di zend 2 cambia anche la gestione dei costruttori: non viene più preso in considerazione il metodo con lo stesso nome della classe bensì il metodo "__construct()".
N.b. Per questioni di retrocompatibilità comunque se non venisse trovato il metodo "__contruct()" verrebbe preso in considerazione il vecchio tipo di costruttore.
Allo stesso tempo vengono aggiunti altri metodi speciali:
- __destruct() : il distruttore della classe (molto utile ad esempio per chiudere stream aperti in altri metodi)
- __clone() : questo metodo serve per gestire la clonazione dell'oggetto
- __set(): metodo richiamato quando si tenta di accedere in scrittura ad una variabile dell'oggetto
- __get(): metodo richiamato quando si tenta di accedere in lettura ad una variabile dell'oggetto
- __call(): metodo richiamato quando si tenta di accedere ad un metodo dell'oggetto
Altre novità
Lo zend engine 2 introduce anche altre novità interessanti come ad esempio il "derefencing" degli oggetti restituiti dalle funzioni. Questo significa che possiamo richiamare i metodi di un oggetto restituito da una funzione direttamente senza dover passare attraverso una variabile.
Esempio:
function getAnObject(){
return new AnObject() ;
}
getAnObject()->MetodoDellOggetto() ;
// con lo zend 1 bisognava salvare in una variabile l'oggetto restituito per poter accedere ai suoi metodi
È inoltre possibile determinare la classe da cui ha avuto origine un oggetto tramite la parola riservata "instanceof".
Dal punto di vista di Php5 direttamente vengono introdotti corposi miglioramenti alla gestione dell'xml e dei socket. È stata invece eliminata la versione "bundled" della libreria per l'accesso a MySQL. Fondamentalmente non cambierà niente, ma bisognerà specificare la directory contenente la libreria di accesso a MySQL con l'opzione ""-with-mysql" passata al "./configure" in fase di compilazione.
Conclusioni
È stata da poco rilasciata (29 Giugno 2003) la versione Beta 1 di Php 5.0.0. L'installazione sotto linux non presenta problemi mentre sembra molto difficoltosa la procedura sotto windows.
In conclusione vorrei comunque rassicurare gli utilizzatori di php4. Il codice rimmarrà praticamente compatibile al 100%. Inoltre, come confermato dalla stessa zend, il php è nato come linguaggio procedurale e rimmarrà un linguaggio procedurale. Le modifiche introdotte da php5 vanno viste semplicemente come delle aggiunte e non come un tentativo di rendere il linguaggio inutilizzabile in maniera procedurale.