Как динамически вызывать метод класса в 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) 

Вы имеете в виду вот так?

 <?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, поэтому попробуйте использовать их, если вы не знаете, сколько аргументов вы собираетесь передать методу.


Редактировать: предыдущий редактор сделал отличную работу по очистке моего ответа, но удалил ссылку на 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 на несколько порядков ниже, чем при использовании любой из перечисленных выше опций.

 call_user_func(array($object, 'methodName')); 

Для получения дополнительной информации см. Документацию обратного вызова php.

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 поскольку нет экземпляра класса. (это одна из причин, по которой они идут намного быстрее).

Лучший способ найти

 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);