2010-11-26 10 views
18

Estoy tratando de usar call_user_func para llamar a un método desde otro método del mismo objeto, p.PHP Llamar a un método de instancia con call_user_func dentro de la misma clase

class MyClass 
{ 
    public function __construct() 
    { 
     $this->foo('bar'); 
    } 
    public function foo($method) 
    { 
     return call_user_func(array($this, $method), 'Hello World'); 
    } 

    public function bar($message) 
    { 
     echo $message; 
    } 
} 

new MyClass; debe devolver 'Hola Mundo' ...

¿Alguien sabe la forma correcta para lograr esto?

¡Muchas gracias!

+1

Parece que está bien. ¿Qué no funciona? –

+1

[Volver] (http://de.php.net/manual/en/function.return.php) ha definido el significado en PHP y si se refiere a otra cosa, debe aclarar eso. – Gordon

Respuesta

21

El código que publicó debería funcionar bien. Una alternativa sería utilizar "variable functions" así:

public function foo($method) 
{ 
    //safety first - you might not need this if the $method 
    //parameter is tightly controlled.... 
    if (method_exists($this, $method)) 
    { 
     return $this->$method('Hello World'); 
    } 
    else 
    { 
     //oh dear - handle this situation in whatever way 
     //is appropriate 
     return null; 
    } 
} 
+1

esto también es más rápido que usar 'call_user_func' aunque he visto a muchos fruncir el ceño al hacerlo de esta manera ... No soy uno de esos :-) – prodigitalson

+0

este es uno de esos modismos 'con gran poder viene gran responsabilidad'. ..utilizarlo para bien, no mal :) –

+3

Me molestaría un poco sobre esto porque arroja un error fatal si el método no existe, pero es probable que sea seguro suponer que el control se realiza en otro lugar –

10

Esto funciona para mí:

<?php 
class MyClass 
{ 
    public function __construct() 
    { 
     $this->foo('bar'); 
    } 
    public function foo($method) 
    { 
     return call_user_func(array($this, $method), 'Hello World'); 
    } 

    public function bar($message) 
    { 
     echo $message; 
    } 
} 

$mc = new MyClass(); 
?> 

Esto consigue ser impreso:

wraith:Downloads mwilliamson$ php userfunc_test.php 
    Hello World 
+0

Gracias, voy a darle otra oportunidad, debo haber tenido un error cuando lo probé originalmente! – Fred

2

nuevos MiClase; Debería devolver 'Hello World' ...

Un constructor no devuelve nada.

+2

Creo que "retorno" se entiende en un sentido muy amplio aquí (léase: se refiere al "eco"). Aún así, tiene razón –

+0

@Pekka y quien esté de acuerdo con usted. Si el OP significaba 'return' para significar 'echo', ¿por qué el OP está haciendo la pregunta? El código ** does ** 'echo' cuando se invoca el ctor. – Gordon

+0

Un constructor no devuelve nada ... – netcoder

Cuestiones relacionadas