2008-11-07 20 views

Respuesta

80

Funciona en ambos sentidos - es necesario utilizar la sintaxis correcta

// Non static call 
call_user_func(array($obj, 'method')); 

// Static calls 
call_user_func(array('ClassName', 'method')); 
call_user_func('ClassName::method'); // (As of PHP 5.2.3) 
+3

Y estos: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php –

16

Te refieres a esto?

<?php 

class A { 
    function test() { 
     print 'test'; 
    } 
} 

$function = 'test'; 

// method 1 
A::$function(); 

// method 2 
$a = new A;  
$a->$function(); 

?> 
16

Opción 1

// invoke an instance method 
$instance = new Instance(); 
$instanceMethod = 'bar'; 
$instance->$instanceMethod(); 

// invoke a static method 
$class = 'NameOfTheClass'; 
$staticMethod = 'blah'; 
$class::$staticMethod(); 

Opción 2

// invoke an instance method 
$instance = new Instance(); 
call_user_func(array($instance, 'method')); 

// invoke a static method 
$class = 'NameOfTheClass'; 
call_user_func(array($class, 'nameOfStaticMethod')); 
call_user_func('NameOfTheClass::nameOfStaticMethod'); // (As of PHP 5.2.3) 

La opción 1 es más rápido que la Opción 2 para tratar de utilizarlos a menos que no sabe cuántos argumentos vas a estar pasando al método.


edición: editor anterior hizo un gran trabajo de limpieza mi respuesta, pero elimina la mención de call_user_func_array que es diferente entonces call_user_func.

PHP tiene

mixed call_user_func (callable $callback [, mixed $parameter [, mixed $... ]]) 

http://php.net/manual/en/function.call-user-func.php

Y

mixed call_user_func_array (callable $callback , array $param_arr) 

http://php.net/manual/en/function.call-user-func-array.php

Usando call_user_func_array es órdenes de magnitud más lento a continuación, utilizando cualquiera de las opciones enumeradas anteriormente.

1

EDIT: Acabo de descifrar lo que intentabas preguntar ... bueno ... de todos modos dejaré mis comentarios. Puede sustituir los nombres de las clases y los métodos con variables si te gusta .. (pero usted está loco) - Nick


Para llamar a una función desde dentro de una clase se puede hacer de dos maneras ...

O bien puede crear una instancia de la clase y luego llamarla. ej .:

$bla = new Blahh_class(); 
$bla->do_something(); 

o ... se puede llamar a la función estática .. es decir, sin ninguna instancia de la clase. p.:

Blahh_class::do_something() 

, por supuesto, usted tiene que declarar que su función es estática:

class Blahh_class { 
    public static function do_something(){ 
     echo 'I am doing something'; 
    } 
} 

Si una clase no se define como estática, a continuación, debe crear una instancia del objeto .. (por lo el objeto necesita un constructor) por ejemplo:

class Blahh_class { 
    $some_value; 

    public function __construct($data) { 
     $this->$some_value = $data; 
    } 

    public function do_something() { 
     echo $this->some_value; 
    } 
} 

lo importante para recordar es que las funciones de clase estáticos no pueden usar $this ya que no hay ningún caso de los CLAS s. (Esta es una de las razones por las que van mucho más rápido.)

0

la mejor manera que encuentro es hacer

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip')); 

Está funcionando como un encanto!

0
Class Foo{ 
public function show(){ 
    echo 'I am in Foo Class show method'; 
} 

} 

call_user_func(array('Foo', 'show')); 

$classname = new Foo; 
call_user_func(array($classname, 'show')); 
call_user_func($classname .'::show'); // As of 5.2.3 

$foo = new Foo();  
call_user_func(array($foo, 'show')); 
0

Esto puede ser útil como un sustituto

class ReferenceContainer { 

    function __construct(CallbackContainer $callbackContainer) { 

     //Alternatively you can have no parameters in this constructor and create a new instance of CallbackContainer and invoke the callback in the same manner   
     //var_dump($this->callbackContainer); 
     $data = 'This is how you parse a class by reference'; 
     $callbackContainer->myCallback($data); 

    } 

} 

class CallbackContainer { 

    function __construct() {} 

    function myCallback($data) { 

     echo $data."\n"; 

    } 

} 

$callbackContainer = new CallbackContainer(); 
$doItContainer = new ReferenceContainer($callbackContainer); 
Cuestiones relacionadas