如何在PHP中动态调用类方法?

时间:2008-11-07 18:50:51

标签: php callback

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

call_user_func(...)

仅适用于静态函数?

感谢。

9 个答案:

答案 0 :(得分:88)

它适用于两种方式 - 您需要使用正确的语法

//  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 :(得分:23)

选项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不同的call_user_func_array。

PHP已

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) 

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

AND

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

答案 2 :(得分:16)

你的意思是这样吗?

<?php

class A {
    function test() {
        print 'test';
    }
}

$function = 'test';

// method 1
A::$function();

// method 2
$a = new A;    
$a->$function();

?>

答案 3 :(得分:2)

call_user_func(array($object, 'methodName'));

有关详细信息,请参阅php callback documentation.

答案 4 :(得分:1)

编辑:我刚刚解决了你想要问的问题......嗯......无论如何都会留下我的评论。如果你愿意,你可以用变量替换类和方法的名称..(但你疯了) - 尼克


要从类中调用函数,您可以使用以下两种方法之一...

您可以创建该类的实例,然后调用它。 e.g:

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

或...你可以静态调用函数..即没有类的实例。 e.g:

Blahh_class::do_something()

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

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

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

class Blahh_class {
    $some_value;

    public function __construct($data) {
        $this->$some_value = $data;
    }

    public function do_something() {
         echo $this->some_value;
    }
}

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

答案 5 :(得分:0)

我发现的最佳方式是

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

它的工作就像一个魅力!

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这可能有用作替代

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

答案 8 :(得分:0)

从PHP7开始,您使用类似数组的方式:

// Static call only
[TestClass::class, $methodName](...$args);

// Dynamic call, static or non-static doesn't matter
$instance = new TestClass;
[$instance, $methodName](...$args);

只需将类名替换为TestClass,将方法名替换为$methodName,将方法参数替换为...$args。请注意,在后一种情况下,该方法是静态的还是非静态的都没有关系; PHP将自动调用它。