Cos’è il metodo magico __call?
In PHP, il metodo magico __call()
è un metodo che viene invocato automaticamente quando si cerca di chiamare un metodo non definito in una classe. Questo metodo accetta due parametri: il nome del metodo che si sta cercando di chiamare e un array contenente gli argomenti passati al metodo.
Il metodo magico __call()
viene utilizzato principalmente quando si desidera creare una classe che gestisce dinamicamente i metodi chiamati su di essa. Ad esempio, potrebbe essere utilizzato per creare un sistema di gestione degli eventi, in cui il nome del metodo rappresenta l’evento che si vuole gestire e gli argomenti passati rappresentano i dati associati all’evento.
Un altro caso d’uso comune per il metodo magico __call()
è quando si desidera creare una classe che si comporta come un proxy per un’altra classe. In questo caso, __call()
potrebbe essere utilizzato per instradare le chiamate di metodo alla classe sottostante.
Qual’é la sintassi del metodo magico __call?
public function __call($name, $arguments) {
// corpo del metodo
}
Un esempio con il metodo magico __call.
class Matematica {
public function somma($a, $b) {
return $a + $b;
}
}
class Calcolatore {
protected $matematica;
public function __construct(Matematica $matematica) {
$this->matematica = $matematica;
}
public function __call($nomeMetodo, $args) {
if(method_exists($this->matematica, $nomeMetodo)) {
return call_user_func_array(array($this->matematica, $nomeMetodo), $args);
} else {
throw new Exception("Metodo $nomeMetodo non trovato");
}
}
}
$calcolatore = new Calcolatore(new Matematica());
echo $calcolatore->somma(2, 3); // output: 5
In questo esempio, abbiamo due classi: Matematica
e Calcolatore
. La classe Matematica
ha un metodo somma()
che prende due argomenti e restituisce la somma.
La classe Calcolatore
ha una proprietà $matematica
che contiene un’istanza della classe Matematica
e un metodo magico __call()
. Quando viene chiamato un metodo sulla classe Calcolatore
, il metodo magico __call()
controlla se il metodo chiamato esiste nella classe Matematica
. Se il metodo esiste, viene chiamato il metodo corrispondente sulla classe Matematica
. In caso contrario, viene generata un’eccezione.
Infine, viene creata un’istanza della classe Calcolatore
e viene chiamato il metodo somma()
. Poiché il metodo somma()
non è stato definito esplicitamente nella classe Calcolatore
, viene invocato il metodo magico __call()
che a sua volta richiama il metodo somma()
sulla classe Matematica
. Il risultato della somma (5) viene quindi stampato a schermo.