关于回调:如何在PHP中动态调用类方法?

How do I dynamically invoke a class method in PHP?

如何在PHP中动态调用类方法?类方法不是静态的。看来

只适用于静态函数?

谢谢。


这两种方法都有效-您需要使用正确的语法

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
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

http://php.net/manual/en/function.call-user-func.php

1
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比使用上面列出的任何一个选项慢几个数量级。


你是说像这样?

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
call_user_func(array($object, 'methodName'));

有关详细信息,请参阅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;
    }
}

重要的是要记住,静态类函数不能使用$this,因为没有类的实例。(这是他们跑得更快的原因之一。)


这可能是一个有用的替代品

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
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

它像一个魅力!