我如何dynamic调用PHP中的类方法?

我如何dynamic调用PHP中的类方法? 类方法不是静态的。 看起来

call_user_func(...) 

只适用于静态function?

谢谢。

它可以同时工作 – 您需要使用正确的语法

 // 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更快,所以尽量使用它们,除非你不知道要传递给方法的参数有多less。


编辑:以前的编辑做了很好的清理我的答案,但删除了不同于call_user_func的call_user_func_array。

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

有关更多详细信息,请参阅phpcallback文档。

编辑:我只是想出了你想问的问题……好吧,我会留下我的意见。 如果你喜欢,你可以用variablesreplace类和方法的名字。(但是你疯了) – 尼克


要从一个类中调用一个函数,你可以通过以下两种方法之一来完成…

你可以创build一个类的实例,然后调用它。 例如:

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

或者…你可以静态地调用这个函数。即没有这个类的实例。 例如:

 Blahh_class::do_something() 

当然你需要声明你的函数是静态的:

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

如果一个类没有被定义为静态,那么你必须创build一个对象的实例..(所以对象需要一个构造函数)例如:

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