如何在PHP中动态调用类方法?[副本]

ckocjqey  于 2023-08-02  发布在  PHP
关注(0)|答案(7)|浏览(134)

此问题在此处已有答案

How to use class methods as callbacks(5个答案)
去年关闭。
如何在PHP中动态调用类方法?类方法不是静态的。看来

call_user_func(...)

字符串
只适用于静态函数?

  • 谢谢-谢谢
iovurdzv

iovurdzv1#

它是双向的-您需要使用正确的语法

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

字符串

ztyzrc3y

ztyzrc3y2#

备选方案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_array,这是不同的,然后call_user_func。
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比使用上面列出的任何一个选项要慢几个数量级。

i5desfxk

i5desfxk3#

你是说像这样吗

<?php

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

$function = 'test';

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

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

?>

字符串

kgsdhlau

kgsdhlau4#

从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 8.1

PHP 8.1中有一个新的一级可调用语法:

$callable = TestClass::$methodName(...);
// Or
$callable = $instance->$methodName(...);

$callable(...$args);

q43xntqr

q43xntqr5#

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

字符串
有关更多详细信息,请参阅php回调文档。

aelbi1ox

aelbi1ox6#

编辑:我刚刚才明白你想问什么……好吧,不管怎样,我会留下我的评论。如果你喜欢的话,你可以用变量来代替类和方法的名字。。(但是你疯了)- nick
要从类中调用函数,您可以使用以下两种方法之一...
您可以创建类的示例,然后调用它。例如:

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

字符串
或者...你可以静态调用函数..即没有类的示例。例如:

Blahh_class::do_something()


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

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


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

class Blahh_class {
    $some_value;

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

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


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

yzckvree

yzckvree7#

这可能是有用的替代品

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

字符串

相关问题