动态调用类中的方法

时间:2019-02-26 17:42:29

标签: php

我最近处理了一些代码,不得不在其中动态调用类中的方法。

我最终使用的解决方案只有两行,因为“动态”部分只是我需要调用的实际方法名称的一小部分。

这是我最终使用的解决方案:

$pull = "pull_{$type}_day"; 
$day = $download->$pull();

最初,我尝试将其设置为一行,但是没有用。从技术上讲,上面的代码为什么起作用,而下面的代码却不起作用?

$day = $download->"pull_{$type}_day"();

2 个答案:

答案 0 :(得分:5)

如果将字符串或字符串的一部分用作方法(或属性),则需要像这样将其用{}包围:

#property
echo $foo->{"bar"};

#method call
echo $foo->{"bar"}();

因此,如果您需要在字符串部分中使用变量,则遵循与任何普通字符串相同的规则。

 echo $foo->{"bar".$bar}();
 echo $foo->{'bar'.$bar.'bar'}();
 echo $foo->{"bar{$bar}bar"}();

以此类推。这是一个完整的例子

class foo{

    function pull_1_day(){
        echo "bar";
    }
}

$a = 1;

(new foo)->{"pull_{$a}_day"}();

输出

  bar

Sandbox

这与PHP允许您将字符串用作这样的变量的方式相同:

$foo = 'bar';
echo ${"foo"}; 

输出

bar

Sandbox

相同的语法。

答案 1 :(得分:1)

为什么不使用call_user_func()

我发现它更易于阅读和解析。

假设您拥有:

class pull {
    public function pull_foo_day () {
        echo "hello";
    }
}

$pull = new pull();
$type = "foo";

您可以简单地做到:

call_user_func([$pull, "pull_{$type}_day"]);

输出:

  

你好

看到它工作here