2012-02-02 20 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(); 
} 

Quiero preparar la variable de función primero para su uso posterior en lugar de poner las condiciones en un bucle. ¿Hay alguna forma de hacerlo?¿Cómo asignar una función de objeto a una variable?

+0

cuidadosa con los argumentos sobre susurro/grito/etc. Estás jugando con fuego de graznidos como pato. – landons

+0

@landons No veo cómo hay un ataque de "quacks-like-a-duck", teniendo en cuenta que (PHP) está todo tipeado dinámicamente de todos modos ... –

+0

@landons realmente? Ni siquiera lo noté jeje – kaz

Respuesta

4

Usted puede poner el nombre de función en una cadena:

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

Más adelante:

$obj->$func 

Puede también use una devolución de llamada:

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

después:

call_user_func($func); 

o:

call_user_func_array($func, $args); 
+0

@notJim, ¿cuál es más recomendable usar? – kaz

+0

@pst: Esta es una devolución de llamada de acuerdo con [el manual php] (http://php.net/manual/en/language.pseudo-types.php). @kaz: No tengo una opinión fuerte de ninguna manera. Usualmente uso el '$ obj -> $ func', a menos que necesite pasarlo a otras funciones. – notJim

+0

@notJim. Fue un poco difícil de mi parte: supongo que debería haber enfatizado que (el segundo enfoque) es "una tupla de información para invocar un método por nombre" y no una clase de primera clase. valor (o función de devolución de llamada) :) –

6

Puede llamar a los métodos por su nombre:

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

$obj->$fn(); 
+3

Sí (+1) puede hacerlo, pero esto técnicamente no es lo que la pregunta está haciendo :-) En Ruby y Python es Es posible obtener "métodos vinculados" (funciones asociadas con un contexto de objeto), mientras que C# tiene grupos de métodos que son convertibles a delegados (también asociados con un contexto de objeto en este caso), por ejemplo. ¿Hay algún concepto así con PHP? (Diga, 5.3) –

+0

@pst Creo que no existe una contraparte php del método enlazado, lo buscaremos. PHP es realmente un lenguaje antiguo, tenemos suerte porque es flexible y los programadores pueden trabajar mucho. – kaz

+0

@pst: No hay. PHP no tenía objetos funcionales _en absoluto_ hasta el lanzamiento de PHP 5.3 - diablos, 'create_function' aún devuelve un gensym - e incluso con ellos no hay forma de obtener un objeto de función para una función definida de cualquier variedad, y mucho menos un método vinculado – duskwuff

Cuestiones relacionadas