如何在这里摆脱PHP通知?

omg*_*omg 0 php notice

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

K. *_*ert 7

您会收到通知,因为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中可用,它称为数组解除引用.


Eve*_*ert 6

$funcs = array('t1','t2');
Run Code Online (Sandbox Code Playgroud)

不直观,但这就是它的工作原理

  • @Shore在PHP中,你没有传递函数.你只是传递名字并执行它.你的For循环中的var_dump($ i),你会看到它是一个字符串.$ func [$ i]()被解释为(string)'t1'(),然后假定它是函数调用t1().底线:您不能将函数存储为php中的变量 (2认同)