2012-02-02 17 views
6
class example() 
{ 
    function shout($var) 
    { 
     echo 'shout'.$var; 
    } 

    function whisper($var, $bool) 
    { 
     if($bool) 
     { 
      echo $var; 
     } 
    } 
} 

$obj = new example(); 

if($var) 
{ 
    $func = $obj->shout(); 
}else 
{ 
    $func = $obj->whisper(); 
} 

Voglio preparare la variabile di funzione prima per un uso successivo invece di inserire le condizioni in un ciclo. C'è un modo possibile per farlo?Come assegnare una funzione oggetto a una variabile?

+0

attento con gli argomenti su whisper/grido/etc. Stai giocando con un fuoco da ciarlatani. – landons

+0

@landons Non vedo come ci sia un "ciarpame-come-un-anatra" fuoco, considerando che (PHP) è tutto digitato in modo dinamico comunque ... –

+0

@landons davvero? non l'ho nemmeno notato hehe – kaz

risposta

4

È possibile inserire il nome della funzione in una stringa:

if($var) 
{ 
    $func = 'shout'; 
}else 
{ 
    $func = 'whisper'; 
} 

seguito:

$obj->$func 

Puoi utilizzare anche una richiamata:

if($var) 
{ 
    $func = array($obj, 'shout'); 
}else 
{ 
    $func = array($obj, 'whisper'); 
} 

tardi:

call_user_func($func); 

o:

call_user_func_array($func, $args); 
+0

@notJim, quale è più consigliabile usare? – kaz

+0

@pst: Questa è una richiamata secondo [il manuale php] (http://php.net/manual/en/language.pseudo-types.php). @kaz: Non ho una forte opinione in entrambi i casi. Di solito uso '$ obj -> $ func', a meno che non debba passare ad altre funzioni. – notJim

+0

@notJim E 'stato un po' idiota da parte mia: suppongo che avrei dovuto invece enfatizzarlo (il secondo approccio) è "una tupla di informazioni per invocare un metodo per nome" e non una prima classe valore (o funzione di callback) :) –

6

È possibile chiamare i metodi per nome:

if ($var) { 
    $fn = 'shout'; 
} else { 
    $fn = 'whisper'; 
} 

$obj->$fn(); 
+3

Sì (+1) puoi, ma questo tecnicamente non è quello che la domanda si pone :-) In Ruby e Python è è possibile ottenere "metodi associati" (funzioni associate ad un contesto di oggetto), mentre C# ha gruppi di metodi che sono convertibili in delegati (anche in questo caso associati ad un contesto di oggetto), per esempio. Esiste un concetto del genere con PHP? (Say, 5.3) –

+0

@ pst penso che non ci sia alcuna controparte php del metodo associato - lo avremmo cercato. PHP è davvero una lingua vecchia, siamo fortunati perché è flessibile che i programmatori possano fare un sacco di lavoro. – kaz

+0

@pst: non c'è. PHP non ha avuto oggetti funzione _tutti_ fino al rilascio di PHP 5.3 - heck, 'create_function' restituisce ancora un gensym - e anche con quelli non c'è modo di ottenere un oggetto funzione per una funzione definita di qualsiasi varietà, per non parlare di un metodo vincolato. – duskwuff

Problemi correlati