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

PHP 5.3: le novità

Le principali novità della versione 5.3 di PHP, la versione che ci porterà direttamente alla release 6 del noto e diffuso linguaggio di scripting
Le principali novità della versione 5.3 di PHP, la versione che ci porterà direttamente alla release 6 del noto e diffuso linguaggio di scripting
Link copiato negli appunti

Alla fine dello scorso giugno il team di progettazione di PHP ha rilasciato, dopo molto tempo di sviluppo, la versione 5.3 del linguaggio. Nonostante sia una normale point release come le precedenti 5.1 e 5.2, la nuova versione 5.3 ha davvero il sapore di una major release a tutti gli effetti, come una perfetta traghettatrice tra la versione 5 e l'ormai attesissima versione 6.

In questo articolo vedremo tutte le più importanti novità che PHP 5.3 porta con sé, caratteristiche con cui gli sviluppatori devono prendere confidenza se desiderosi di adattarsi ad un ambiente di sviluppo futuro, in maniera simile a come accadde nel cambiamento tra la versione 4 e la 5.

Namespace

Una delle novità più importanti introdotte è sicuramente rappresentata dal supporto per i namespace. Per una descrizione compatta di quest'ultimo componente trovo saggio citare ciò che ha scritto Gabriele Farina nell'ottimo articolo Le novità di PHP 5.3: namespace, scritto oramai quasi due anni fa.

I namespace sono un costrutto semantico che permette al programmatore di evitare la collisione tra i nomi di classi, funzioni o altre strutture racchiudendole all'interno di uno spazio di nomi indipendente dal codice restante. Il codice può accedere successivamente a queste strutture definite all'interno del namespace anteponendo al nome della struttura il namespace stesso oppure segnalando all'interprete la volontà di includere nello spazio di nomi corrente tutto il contenuto di un determinato namespace.

I namespace potrebbero quindi essere visti come dei contenitori semantici che contengono dei normali costrutti PHP i quali possono essere interrogati per richiedere determinati elementi oppure possono essere rovesciati all'interno di un altro contenitore al fine di ingrandire lo spazio dei nomi correnti se necessario.

Per una consultazione dettagliata su come, quando e perché usare i namespace, vi rimando al suddetto articolo.

Late State Bindings

La tecnica del "Late State Bindings" permette di superare, in ambito di programmazione ad oggetti, le limitazioni offerte dai dati statici della classe. In particolare, sappiamo che un metodo statico viene risolto (o associato) in fase di compilazione; prima della release 5.3 non esisteva una modalità standard che permetteva di cambiare questo comportamento (in realtà esistono strategie apposite o hack particolari, ma presentano non poche limitazioni e controindicazioni). Tramite l'uso della parola chiave static associata al metodo, non si risolverà più utilizzando l'ambito statico di compilazione (ovvero quello dove è stata effettuata la dichiarazione del metodo), ma verrà associato in fase di esecuzione o run-time. Vediamo, nella pagina successiva, un esempio pratico.

Gli esempi pratici più classici che spiegano egregiamente questo concetto sono questi:

Senza Late Bindings:

<pre>
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}
class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}
// stampa "A". Viene utilizzato l'ambito statico, in fase di compliazione
B::test();

Con Late Bindings:

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Late Static Bindings in azione
    }
}
class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}
// stampa "B". Viene utilizzato l'ambito di esecuzione o run-time
B::test();

Chiusure e funzioni lambda

Chi sviluppa in Javascript (o altri linguaggi di scripting moderni) sarà sicuramente conscio dell'importanza delle funzioni lambda (chiamate anche chiusure/closures o funzioni anonime/anonymous functions) e della impressionante flessibilità che offrono al codice.

Fino a qualche tempo fa, sembrava quasi un sogno potere scrivere funzioni anonime con PHP, ma ora tutto questo è realtà. Per dichiarare una chiusura non occorre utilizzare alcun namespace (da qui il termine funzione anonima), ma solo il corpo della funzione che segue la parola keyword function e la consueta lista di parametri. Uno degli usi più comuni delle funzioni anonime è sicuramente quello di fungere da callback:

// stampa redBlue
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'red-blue');

Nello snippet precedente, non abbiamo la necessità di dichiarare una funzione e poi passarla come parametro, ma possiamo utilizzare direttamente un callback come argomento della funzione interna preg_replace_callback. In questo caso l'espressione regolare si occupa di convertire le stringhe hypen in stringhe camel case, dunque 'red-blue' diventerà 'redBlue'.

Sintassi NOWDOC

La sintassi Nowdoc è un'altra ottima aggiunta. Come riportato sulla pagina ufficiale della documentazione, Nowdoc sta alla sintassi con virgolette singole come Heredoc sta alla sintassi con virgolette doppie. Se la tecnica Heredoc consente di includere grandi quantità di testo senza la necessità di effettuare l'escape dei caratteri speciali e con la possibilità dell'interpolazione delle variabili infatti, Nowdoc offre le medesime possibilità eccezion fatta per il riconoscimento delle variabili.

Proprio come accade per le virgolette singole, ogni carattere verrà interpretato come carattere semplice, senza nessun significato speciale. Questa tecnica è ottima ad esempio per includere blocchi di codice (per esempio PHP) stampabili:

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
EOT;

Come possiamo notare, è necessario posizionare la label tra virgolette singole. Sarà inoltre possibile (opzionalmente) includere la label tra virgolette doppie nel caso della sintassi Heredoc per differenziare meglio i due comportamenti.

Goto

Il nuovo operatore goto si utilizza per "saltare" ad una determinata sezione dello script. Tramite la dichiarazione della keyword goto seguita dalla label, si forza PHP a saltare tutte le istruzioni seguenti fino ad arrivare alla prima istruzione che seguira la label desiderata seguita dal carattere dei due punti (:).

// stampa unicamente 'Bar'
goto a;
echo 'Foo';
a:
echo 'Bar';

Nell'esempio precedente solo la stringa 'Bar' verrà stampata, mentre l'istruzione che dovrebbe stampare la stringa 'Foo' verrà saltata. Una nota importante: la label deve essere conteuta nello stesso file e nello stesso contensto dell'operatore goto, ciò significa che non sarà possibile "saltare fuori o dentro" da una funzione o da un metodo, ad esempio, oppure inserirsi in un qualsiasi ciclo.

Nella second parte dell'articolo vedremo i nuovi metodi magici e le altre novità di questo ricco aggiornamento.

Metodi magici __callStatic ed __invoke

Come ho dichiarato nella lezione numero 25 della Guida alla programmazione orientata agli oggetti, il metodo magico __callStatic diviene ora disponibile con la versione 5.3. Quest'ultimo, come ogni metodo magico, viene richiamato al verificarsi di una determinata condizione: in questo caso si tratta del richiamo di un metodo inesistente nel contesto statico:

class MyClass {
        public function __callStatic($name, $args) {
                echo "È stato richiamato il metodo " . $name . " in un contesto statico con i seguenti argomenti: ";
                foreach($args as $arg) echo $arg . " ";
        }
}
$obj1 = new MyClass();
// stampa "È stato richiamato il metodo setName in un contesto statico con i seguenti argomenti: George"
MyClass::setName("George");

Il metodo magico __invoke invece (lezione 26 della guida) viene richiamato quando si usa un oggetto come una funzione:

// __invoke
class MyClass {
    public function __invoke($x) {
        echo $x;
    }
}
$obj1 = new MyClass();
$obj1(5);

Shortcut per l'operatore ternario

È ora possibile utilizzare l'utilissimo operatore ternario in un'altra modalità, oltre a quella standard, che consente di eliminare la parte centrale dell'espressione:

// sintassi standard
(expr1) ? (expr2) : (expr3)
// sintassi alternativa
expr1 ?: expr3

Questo dice a PHP di restituire expr1 nel caso venga valutata come true, in caso contrario di restituire expr3.

Garbage Collector per i riferimenti ciclici

È ora possibile attivare e disattivare il Garbage Collector per i riferimenti ciclici in maniera dinamica, rispettivamente tramite le funzioni gc_enable e gc_disable. Queste due funzioni non accettano alcun parametro e non restituiscono alcun valore. Di default il nuovo Garbage Collector è attivato.

Errori E_DEPRECATED ed E_USER_DEPRECATED

Grazie alla nuova tipologia di errore E_DEPRECATED, sarà possibile forzare PHP ad emettere degli errori di tipo run-time notices che ci avviseranno sulle parti di codice considerate "deprecate" che non funzioneranno correttamente nelle future release del linguaggio.

La controparte E_USER_DEPRECATED è in tutto e per tutto identica alla precedente, tranne per il fatto che può essere generata dallo sviluppatore tramite la funzione trigger_error.

Altre novità

Oltre ai cambiamenti più radicali ed importanti presentati in precedenza, occorre ricordare che sono ancora molte le novità ed i changelogs introdotti con la versione 5.3. Ecco una panoramica molto veloce dei cambiamenti "minori":

  • Le costanti possono ora essere dichiarate esternamente alle classi tramite la keyword const
  • Le eccezioni possono ora essere dichiarate in modo ramificato
  • È consentito l'accesso dinamico ai metodi statici
  • È ora consentito utilizzare la sintassi Heredoc per inizializzare variabili statici e le proprietà/costanti di una classe
  • L' HTTP Stream Wrapper considera i codici di status da 200 a 399 come codici di successo
  • Supporto delle nuove estensioni ext/phar, ext/intl, ext/fileinfo, ext/sqlite3, ext/enchant
  • Migliore arrotondamento dei float
  • Aumento della flessibilità nella configurazione di php.ini
  • Oltre 140 bug fixes

Tutte le novità di questa versione sono reperibili nell'annuncio ufficiale e nel corposissimo changelog di versione.

Ti consigliamo anche