Eccoci qua con una nuova puntata della serie verso PHP 5.
Dopo il php.ini e le modifiche necessarie, è l'ora di affrontare un altro aspetto profondamento mutato di PHP a partire dalla 5 major release: il supporto alla programmazione object oriented.
In parte l'argomento è già stato introdotto, ad esempio con la segnalazione dell'operatore instanceof
, molto Java style, che ora prende il posto della più classica funzione is_a()
.
Ma questo è nulla in confronto alle reali novità del linguaggio, per le quali potrebbe non bastare un solo libro. Vedrà di riassumere quanto possibile in un paio di post!
Come sempre, approfondimenti sono disponibili nella guida Class and Object di PHP 5.
Costruttore e distruttore
Cominciamo dalla base. Un oggetto va creato e, qualche volta, distrutto... no?
In PHP 4 il concetto di costruttore era affidato ad una funzione che doveva avere lo stesso nome della classe. Se la funzione era presente, l'interprete la eseguiva in automatico alla creazione di un nuovo oggetto.
class Test() { // costruttore function Test() { // } }
In PHP 5 il concetto di costruttore si evolve con l'introduzione della funzione __construct()
.
In aggiunta, appare per la prima volta la funzione __destruct()
che viene richiamata ogni volta che un oggetto viene implicitamente o esplicitamente distrutto.
class Test() { // costruttore function __construct() { // } // distruttore function __destruct() { // } }
Metodi Magici
In aggiunta a questi due metodi, esistono alcuni altri metodi particolari degni di menzione.
Alcuni di essi non sono una novità per chi programma con altri linguaggi ad oggetti.
àˆ il caso, ad esempio, del metodo __toString() che serve per fornire una conversione stringa dell'oggetto corrente.
Un oggetto, infatti, è un tipo di dato complesso, non lineare.
Immaginate il seguente esempio
class User() { private $_firstName; private $_lastName; public function __construct($firstName, $lastName) { $this->_firstName = $firstName; $this->_lastName = $lastName; } public function __toString() { return $this->_firstName . ' ' . $this->_firstName; } } $u = new User('Simone', 'Carletti'); // cosa succede qui? print($u);
In questo caso, è stato deciso che un tentativo di stampare l'oggetto debba fornire come output il nome dell'utente seguito dal suo cognome.
Ogni classe può sovrascrivere il metodo della superclasse fornendo ulteriori specifiche all'output.
Altre funzioni utili sono __clone(), metodo richiamato nel tentativo di clonare un oggetto, __set()
e __get()
richiamati ogni qual volta che una funzione setter o getter viene richiamata e tale funzione non è stata precedentemente dichiarata.
Un eccellente esempio dell'implementazione di __set()
e __get()
è la libreria Zend_View.