Discussione:
Overload dei metodi in PHP
(troppo vecchio per rispondere)
AlphaOmega
2009-09-12 10:14:31 UTC
Permalink
Salve,
sto cercando di capire il modo in cui è stato implementato l'overload
dei metodi in PHP, che sembra un po' farraginoso rispetto a Java ad
esempio. Da quello che ho capito si utilizza la magic function
__call($method, $args) che in generale chiama un metodo non definito
"$method" passandogli un array di argomenti $args, che in pratica si
traduce nell'eseguire il codice in __call. Questo è tutto? Possibile che
con __call si possa invocare un metodo con un nome qualsiasi a cui dare
una serie di parametri qualsiasi? Giustamente io a seconda del nome e
degli argomenti potrei eseguire codice diverso con uno switch ad esempio....
A me sembra un po' debole come implementazione... se ho capito bene la
faccenda...
Alessandro Pellizzari
2009-09-13 09:05:26 UTC
Permalink
Post by AlphaOmega
sto cercando di capire il modo in cui è stato implementato l'overload
dei metodi in PHP, che sembra un po' farraginoso rispetto a Java ad
esempio. Da quello che ho capito si utilizza la magic function
__call($method, $args)
In PHP non c'e` bisogno di overload. Non e` proprio previsto, visto che i
parametri non hanno tipo.

Semplicemente ti fai la tua funzione

public function funzione($p1, $p2, $p3)

e poi con uno switch aiutato da instanceof valuti cosa c'e` in $p1, $p2,
$p3.
Post by AlphaOmega
che in generale chiama un metodo non definito
"$method" passandogli un array di argomenti $args, che in pratica si
traduce nell'eseguire il codice in __call. Questo è tutto?
__call() serve per fare programmazione dinamica, non per l'overloading.

Per esempio potresti usarla per simulare ereditarieta` multipla, che non
e` prevista in PHP.
Post by AlphaOmega
Possibile che
con __call si possa invocare un metodo con un nome qualsiasi a cui dare
una serie di parametri qualsiasi? Giustamente io a seconda del nome e
degli argomenti potrei eseguire codice diverso con uno switch ad
esempio.... A me sembra un po' debole come implementazione... se ho
capito bene la faccenda...
Dipende cosa intendi per debole.
Sono concetti di programmazione tipici dei linguaggi dinamici, che mal si
applicano ai linguaggi statici.
Funzionalita` simili ci sono in python (con quasi lo stesso nome, se non
ricordo male, __call__() )

Bye.
AlphaOmega
2009-09-13 10:57:45 UTC
Permalink
Post by Alessandro Pellizzari
In PHP non c'e` bisogno di overload. Non e` proprio previsto, visto che i
parametri non hanno tipo.
Semplicemente ti fai la tua funzione
public function funzione($p1, $p2, $p3)
e poi con uno switch aiutato da instanceof valuti cosa c'e` in $p1, $p2,
$p3.
Tutto OK. C'è però un autore, Gutmans, che suggerisce l'uso di __call()
e la chiamata per 'delega' per implementare l'overloading dei metodi in
questa maniera:

class HelloWorld {
function display($count)
{
for ($i=0;$i<$count; $i++){
print "ciao mondo\n";
}
return $count;
}
}

class HelloWorldDelegator{
function __construct()
{
$this->obj=new HelloWorld();
}
function __call($method,$args)
{
return call_user_func_array(array($this->obj,$method),$args);
}

private $obj;
}

$obj=new HelloWorldDelegator();
print $obj->display(3);


come vedi in pratica dichiara un classe Delegator che chiama un metodo
dell'oggetto obj istanziato nel costruttore (metodo display), attraverso
call_user_func_array(). Si riesce così a chiamare un metodo di un'altra
classe. Non riesco però a capire perché propone questo modello nel suo
libro (PHP 5 Power Programming) per l'overloading...
Andrea D'Amore
2009-09-13 12:23:13 UTC
Permalink
Post by AlphaOmega
Non riesco però a capire perché propone questo modello nel suo
libro (PHP 5 Power Programming) per l'overloading...
Ma è effettivamente overloading questo? Non mi sembra, mi sembra una
implementazione della delegation in mancanza di un meccanismo interno al
linguaggio.

Loading...