Как я могу динамически вызывать метод класса в PHP? Метод класса не является статическим. Похоже, чтоКак динамически вызывать метод класса в PHP?
call_user_func(...)
работает только со статическими функциями?
Спасибо.
Как я могу динамически вызывать метод класса в PHP? Метод класса не является статическим. Похоже, чтоКак динамически вызывать метод класса в PHP?
call_user_func(...)
работает только со статическими функциями?
Спасибо.
Он работает в обоих направлениях - вы должны использовать правильный синтаксис
// 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'));
Для получения более подробной информации см php callback documentation.
Вы имеете в виду, как это?
<?php
class A {
function test() {
print 'test';
}
}
$function = 'test';
// method 1
A::$function();
// method 2
$a = new A;
$a->$function();
?>
Вариант 1
// invoke an instance method
$instance = new Instance();
$instanceMethod = 'bar';
$instance->$instanceMethod();
// invoke a static method
$class = 'NameOfTheClass';
$staticMethod = 'blah';
$class::$staticMethod();
Вариант 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)
Вариант 1 быстрее, чем вариант 2, чтобы попытаться использовать их, если вы не знаете, сколько аргументов ваш будет переходя к методу.
Edit: Предыдущий редактор сделал большую работу по очистке моего ответа, но удалил упоминание о call_user_func_array, которая отличается тем call_user_func.
PHP имеет
mixed call_user_func (callable $callback [, mixed $parameter [, mixed $... ]])
http://php.net/manual/en/function.call-user-func.php
И
mixed call_user_func_array (callable $callback , array $param_arr)
http://php.net/manual/en/function.call-user-func-array.php
Использование call_user_func_array на несколько порядков медленнее, используя любой из вариантов, перечисленных выше.
EDIT: Я только что разработал то, что вы пытались спросить ... ах хорошо .. оставит мои комментарии в любом случае. Вы можете заменить имена классов и методов с переменными, если вы хотите .. (но вы с ума) - ник
Чтобы вызвать функцию из класса Вы можете сделать это одним из двух способов ...
Либо вы можете создать экземпляр класса, а затем вызвать его. .: например
$bla = new Blahh_class();
$bla->do_something();
или ... вы можете вызвать функцию статически .. т.е. без каких-либо экземпляра класса. , например.:
Blahh_class::do_something()
конечно вы должны объявить, что функция является статическим:
class Blahh_class {
public static function do_something(){
echo 'I am doing something';
}
}
Если класс не определен как статический, то вы должны создать экземпляр объекта .. (так объект нужен конструктор) например:
class Blahh_class {
$some_value;
public function __construct($data) {
$this->$some_value = $data;
}
public function do_something() {
echo $this->some_value;
}
}
важно помнить о том, что функции статического класса не могут использовать $this
, поскольку нет ни одного случая из CLAS s. (Это одна из причин, почему они идут гораздо быстрее.)
лучший способ я нашел, чтобы сделать
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));
Это работает как шарм!
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'));
Это может быть полезно в качестве замены
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);
и эти: http://stackoverflow.com/questions/251485/dynamic-class-method-invocation-in-php – 2014-05-03 20:40:59