I metodi magici - Prima parte



Come abbiamo imparato nel corso delle lezioni precedenti, all'interno delle classi possiamo dichiarare dei metodi "speciali" che vengono definiti metodi magici. Essi, che sono sintatticamente riconoscibili tramite il doppio underscore ("__") iniziale, sono davvero molto importanti. A questo punto della guida abbiamo già analizzato due metodi magici: il metodo costruttore (__construct) ed il metodo distruttore (__destruct).

Come è facile intuire, un metodo magico viene azionato (o invocato) quando si verifica una determinata situazione con la classe o le istanze della stessa. Ecco una panoramica veloce dei metodi magici disponibili con PHP5, che andremo ad analizzare dettagliatamente nel paragrafo successivo e nella prossima lezione:

Nome metodo Azionato quando...
__construct viene creata una nuova istanza della classe
__destruct viene distrutta un'istanza
__call viene richiamato un metodo inaccessibile (nel contesto di un oggetto)
__callStatic viene richiamato un metodo inaccessibile (nel contesto statico)
__set viene usata in scrittura una proprietà inaccessibile
__get viene usata in lettura una proprietà inaccessibile
__isset viene richiamata la funzione isset con una proprietà inaccessibile
__unset viene richiamata la funzione unset con una proprietà inaccessibile
__sleep viene richiamata la funzione serialize con un'istanza
__wakeup viene richiamata la funzione unserialize con un'istanza
__toString vengono richiamate la funzioni echo o print con un'istanza
__invoke viene utilizzato un oggetto come una funzione
__set_state viene richiamata la funzione var_export con un'istanza
__clone viene clonato un oggetto con l'operatore clone

__call e __callStatic

Questi due metodi magici sono molto simili, l'unica differenza è che il primo utilizza l'ambito dinamico mentre il secondo, disponibile dalla versione 5.3.0, utilizza l'ambito statico:

class MyClass {
        public function __call($name, $args) {
                echo "È stato richiamato il metodo " . $name . " con i seguenti argomenti: ";
                foreach($args as $arg) echo $arg . " ";
        }
        
        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 con i seguenti argomenti: George"
$obj1->setName("George");


// stampa "È stato richiamato il metodo setName in un contesto con i seguenti argomenti: George"
MyClass::setName("George");

__set e __get

Anche in questo caso, come nel precedente, si tratta di metodi magici che attuano il principio di overloading. Il loro comportamento è abbastanza intuitivo, l'unica considerazione da fare è che, nel caso si imposti una variabile e si utilizza il metodo magico __set, occorrerà impostarla manualmente all'interno del corpo del metodo stesso.

class MyClass {

        public function __get($name) {
                echo "Si è tentato di accedere alla proprietà \"" . $name . "\" ma non è disponibile";
        }
        
        public function __set($name, $value) {
                echo "Si è tentato di impostare la proprietà \"" . $name . "\" al valore " . $value;
        }

}

$obj1 = new MyClass();

// stampa "Si è tentato di accedere alla proprietà "a" ma non è disponibile"
echo $obj1->a;

// stampa "Si è tentato di impostare la proprietà "a" al valore 10"
$obj1->a = 10;

__isset e __unset

Gli ultimi due metodi magici che consentono l'overloading sono __isset ed __unset. Il loro comportamento è molto intuitivo:

class MyClass {

        public function __isset($name) {
                echo "Si è tentato di richiamare isset con la proprietà \"" . $name . "\" ma non è disponibile";
        }
        
        public function __unset($name) {
                echo "Si è tentato di richiamare unset con la proprietà \"" . $name . "\" ma non è disponibile";
        }

}

$obj1 = new MyClass();

// stampa "Si è tentato di richiamare isset con la proprietà "a" ma non è disponibile"
echo isset($obj1->a);

// stampa "Si è tentato di richiamare unset con la proprietà "a" ma non è disponibile"
unset($obj1->a);

Ultimi articoli PHP

Sessioni PHP: cosa sono, come si usano

Dalla configurazione di PHP, alla gestione delle sessioni in un...

Continuous Integration: automatizziamo i client con Phing

Continuous Integration: automatizziamo i client con Phing. Esempi...

Archiviazione delle applicazioni PHP con Phar

Come incorporare intere applicazioni PHP all'interno di un singolo...

I traits in PHP 5.4

Cosa sono, a cosa servono e come si unsano i traits, la novità per...

PHP 5.4: il web server integrato

Impara ad usare il web server integrato nella versione 5.4 di PHP:...

Altri articoli

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti