我最近处理了一些代码,不得不在其中动态调用类中的方法。
我最终使用的解决方案只有两行,因为“动态”部分只是我需要调用的实际方法名称的一小部分。
这是我最终使用的解决方案:
$pull = "pull_{$type}_day";
$day = $download->$pull();
最初,我尝试将其设置为一行,但是没有用。从技术上讲,上面的代码为什么起作用,而下面的代码却不起作用?
$day = $download->"pull_{$type}_day"();
答案 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
这与PHP允许您将字符串用作这样的变量的方式相同:
$foo = 'bar';
echo ${"foo"};
输出
bar
相同的语法。
答案 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。