¿Cómo puedo invocar dinámicamente un método de clase en PHP? El método de clase no es estático. Parece que¿Cómo invoco dinámicamente un método de clase en PHP?
call_user_func(...)
sólo funciona con las funciones estáticas?
Gracias.
¿Cómo puedo invocar dinámicamente un método de clase en PHP? El método de clase no es estático. Parece que¿Cómo invoco dinámicamente un método de clase en PHP?
call_user_func(...)
sólo funciona con las funciones estáticas?
Gracias.
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)
call_user_func(array($object, 'methodName'));
Para más detalles, ver el php callback documentation.
Te refieres a esto?
<?php
class A {
function test() {
print 'test';
}
}
$function = 'test';
// method 1
A::$function();
// method 2
$a = new A;
$a->$function();
?>
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.
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.)
la mejor manera que encuentro es hacer
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));
Está funcionando como un encanto!
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'));
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);
Y estos: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php –