为变量函数调用准备字符串


prepending a string for a variable function call

PHP支持可变函数。例如,如果$str == 'testfunc';,则$str();呼叫testfunc()。我想用它来测试一堆函数,比如funcname()prefix_funcname()。我在想我可以做一些像。。。

${$prefix . 'funcname'}不起作用。这就给出了这个错误:

Notice: Undefined variable: funcname
Fatal error: Function name must be a string

我尝试过其他几种变体,但都没有成功。我更喜欢在一行中完成所有操作,而不是执行$funcname = $prefix . $functname;$funcname();`。

有什么想法吗?

您已经用PHP 5.6对此进行了标记,因此正确的答案是使用这两行(如果您真的觉得需要,可以将它们放在同一行)或call_user_funccall_user_func_array

像许多其他问题一样,询问如何绕过语法限制一次完成任务,统一可变语法RFC在PHP 7中修复了问题,您可以使用:

($prefix . 'funcname')();

这个RFC被严重低估了。


事情是这样的,你实际上可以做你在早期版本中试图做的事情。

金达。

警告:这太恶心了。使用的风险由您自己承担,否则会遭到其他程序员的报复

${${$prefix . 'funcname'} = $prefix . 'funcname'}();

这绝对是可怕的,但它适用于所有支持的PHP版本(可能在早些时候,我没有尝试过。)

为了解释这一切,让我们说$prefix = "prefix_";

首先${$prefix . 'funcname'}创建一个变量变量(不要使用这些),该变量解析为$prefix_funcname

所以

${$prefix . 'funcname'} = $prefix . 'funcname'

计算到

$prefix_funcname = "prefix_funcname"

因为赋值表达式的值是赋值,所以最外层的${...}得到值"prefix_funcname",并再次给你一个解析为$prefix_funcname的变量,我们已经给了值"prefix_funcname"

给您留下一个对prefix_funcname()的变量函数调用。

请不要这样做