我如何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);