function t1()
{
echo 1;
}
function t2()
{
echo 2;
}
$funcs = array(t1,t2);
$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}
Run Code Online (Sandbox Code Playgroud)
当我执行这个小的PHP文件时:
PHP注意:使用未定义的常量t1 - 在第11行的D:\ jobirn\test\str.php中假定为't1'
PHP注意:使用未定义的常量t2 - 在第11行的D:\ jobirn\test\str.php中假定为't2'
我怎样才能摆脱这些通知?12
您会收到通知,因为PHP不会将函数视为第一类对象.当你这样做
$functions = array(t1, t2);
Run Code Online (Sandbox Code Playgroud)
PHP引擎看到t1和t2,并尝试将其解析为常量,但由于它找不到名为t1/t2的常量,因此它"假设"您要键入数组('t1','t2'); 如果执行var_dump($ functions),则可以看到数组中的项是字符串.
当您尝试将字符串作为函数调用时,例如
$functions[0]()
Run Code Online (Sandbox Code Playgroud)
PHP将查找与字符串同名的函数.我不会将此称为使用字符串作为函数指针,这更像是使用反射.PHP称之为"变量函数",请参阅:
http://hu2.php.net/manual/en/functions.variable-functions.php
因此,摆脱通知的正确方法是:
$functions = array('t1', 't2');
Run Code Online (Sandbox Code Playgroud)
关于为什么
't1'();
Run Code Online (Sandbox Code Playgroud)
不行?不幸的是没有答案.它是PHP,有很多这些令人讨厌的地狱怪癖.这是同样的怪癖:
explode(':', 'one:two:three')[0];
Parse error: syntax error, unexpected '[' in php shell code on line 1
Run Code Online (Sandbox Code Playgroud)
编辑:
上面提到的数组引用语法在PHP5.4中可用,它称为数组解除引用.
$funcs = array('t1','t2');
Run Code Online (Sandbox Code Playgroud)
不直观,但这就是它的工作原理