How do I dynamically invoke a class method in PHP?
如何在PHP中动态调用类方法?类方法不是静态的。看来
1 |
只适用于静态函数?
谢谢。
这两种方法都有效-您需要使用正确的语法
1 2 3 4 5 6 | // 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) |
号
方案1
1 2 3 4 5 6 7 8 9 | // invoke an instance method $instance = new Instance(); $instanceMethod = 'bar'; $instance->$instanceMethod(); // invoke a static method $class = 'NameOfTheClass'; $staticMethod = 'blah'; $class::$staticMethod(); |
。
选项2
1 2 3 4 5 6 7 8 | // 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有
1 |
。
http://php.net/manual/en/function.call-user-func.php
和
1 |
。
http://php.net/manual/en/function.call-user-func-array.php
使用call_user_func_array比使用上面列出的任何一个选项慢几个数量级。
你是说像这样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class A { function test() { print 'test'; } } $function = 'test'; // method 1 A::$function(); // method 2 $a = new A; $a->$function(); ?> |
1 |
有关详细信息,请参阅PHP回调文档。
编辑:我刚刚知道你想问什么……啊,好吧……无论如何都会留下我的评论。如果你喜欢的话,你可以用变量来代替类和方法的名称。(但是你疯了)-尼克
要从类内调用函数,可以使用以下两种方法之一…
您可以创建类的实例,然后调用它。例如。:
1 2 | $bla = new Blahh_class(); $bla->do_something(); |
或者…您可以静态调用函数。也就是说,没有该类的实例。例如。:
1 | Blahh_class::do_something() |
。
当然,您需要声明您的函数是静态的:
1 2 3 4 5 | class Blahh_class { public static function do_something(){ echo 'I am doing something'; } } |
如果某个类未定义为静态类,则必须创建该对象的实例。(因此对象需要一个构造函数)例如。:
1 2 3 4 5 6 7 8 9 10 11 | class Blahh_class { $some_value; public function __construct($data) { $this->$some_value = $data; } public function do_something() { echo $this->some_value; } } |
。
重要的是要记住,静态类函数不能使用
这可能是一个有用的替代品
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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." "; } } $callbackContainer = new CallbackContainer(); $doItContainer = new ReferenceContainer($callbackContainer); |
号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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')); |
号
我找到的最好办法就是
1 |
号
它像一个魅力!