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_func
或call_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()
的变量函数调用。
请不要这样做