Con PHP 5 è possibile simulare l'overloading dei metodi di un oggetto attraverso l'uso del metodo speciale __call().
Se in una classe è definito questo metodo, esso sarà richiamato ogni volta che verrà invocata l'esecuzione di un metodo non definito. __call() quindi è un metodo che intercetta tutte le chiamate di metodi di una classe che non vanno a buon fine. Il PHP passa a __call() il nome del metodo chiamato ed un array contenente i parametri passati.
L'overloading di un metodo può essere quindi realizzato attraverso una sorta di smistatore di chiamate da realizzare all'interno di __call(). Questo smistatore deve essere in grado di riconoscere il tipo e il numero dei parametri passati e deve lanciare la routine più appropriata alla loro gestione.
L'esempio che segue realizza l'overloading del metodo somma() al quale si potranno passare sia interi,sui quali verrà effettuata una somma algebrica, sia stringhe, che verranno invece concatenate. Potranno essere passati un numero qualsiasi di parametri, anche nessuno.
Codice PHP:
<?php
class sommatore
{
function __call($m, $a) {
if($m == 'somma') {
$num_par = count($a);
if(!$num_par) {
echo 'Nessun paramentro passato',"\n\n";
} else {
if($this->sono_interi($a)) {
echo 'Tipo parametri passati: interi (',implode(', ',$a),")\n";
echo 'risultato: ',array_reduce($a,array($this,'somma_numeri')),"\n\n";
} else {
echo 'Tipo parametri passati: stringhe e/o interi (',implode(', ',$a),")\n";
echo 'risultato: ',array_reduce($a,array($this,'somma_stringhe')),"\n\n";
}
}
}
else
echo "Il metodo '$m' non è definito \n\n";
}
function somma_numeri($v, $w) {
$v += $w;
return $v;
}
function somma_stringhe($v, $w) {
$v .= $w;
return $v;
}
function sono_interi($a) {
foreach ($a as $value) {
if (!is_int($value)) return false;
}
return true;
}
}
$mioSommatore = new sommatore();
$mioSommatore->somma();
$mioSommatore->somma(1);
$mioSommatore->somma(3,5);
$mioSommatore->somma('Concatena',' stringa');
$mioSommatore->ciccio();
?>
il risultato sarà:
codice:
Nessun paramentro passato
Tipo parametri passati: interi (1)
risultato: 1
Tipo parametri passati: interi (3, 5)
risultato: 8
Tipo parametri passati: stringhe e/o interi (Concatena, stringa)
risultato: Concatena stringa
Il metodo 'ciccio' non è definito