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