0
function t1()
{
  echo 1;
}
function t2()
{ 
  echo 2;
}

$funcs = array(t1,t2);

$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}

当我执行这个小 php 文件时:

PHP 注意:使用未定义的常量 t1 - 在第 11 行的 D:\jobirn\test\str.php 中假定为 't1'

PHP 注意:使用未定义的常量 t2 - 在第 11 行的 D:\jobirn\test\str.php 中假定为 't2'

我怎样才能摆脱这些通知?12

4

6 回答 6

7

您会收到通知,因为 PHP 不将函数视为第一类对象。当你这样做时

$functions = array(t1, t2);

PHP 引擎看到 t1 和 t2,并尝试将其解析为常量,但由于找不到名为 t1/t2 的常量,它“假定”您要键入 array('t1', 't2'); 如果您执行 var_dump($functions),您可以看到数组中的项目是字符串。

当您尝试将字符串作为函数调用时,例如

$functions[0]()

PHP 将寻找与字符串同名的函数。我不会将其称为使用字符串作为函数指针,这更像是使用反射。PHP 称之为“变量函数”,参见:

http://hu2.php.net/manual/en/functions.variable-functions.php

因此,摆脱通知的正确方法是:

$functions = array('t1', 't2');

关于为什么

't1'();

不行?不幸的是,没有答案。它是 PHP,有很多令人讨厌的怪癖。这与以下怪癖相同:

explode(':', 'one:two:three')[0];
Parse error: syntax error, unexpected '[' in php shell code on line 1

编辑:
上面提到的数组引用语法在 PHP5.4 中可用,它被称为数组解引用。

于 2009-05-21T21:48:09.127 回答
6
$funcs = array('t1','t2');

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

于 2009-05-21T21:17:20.203 回答
1

解决此问题的方法是将 php.ini 设置从

error_reporting = E_ALL 

error_reporting = E_ALL & ~E_NOTICE
于 2009-05-21T21:16:01.733 回答
0

查看 error_reporting() 函数:

http://us2.php.net/manual/en/function.error-reporting.php

它允许您配置显示的错误、通知和警告级别。

例如,如果您想要错误和警告并且没有通知:

错误报告(E_ERROR | E_WARNING);

于 2009-05-21T21:15:12.827 回答
0

如果您指的是字符串,请使用字符串声明:

$funcs = array('t1','t2');

另请参阅PHP 手册中有关可变函数的章节。

于 2009-05-21T21:16:48.737 回答
-1

要使用字符串调用函数,您应该使用花括号

'hello'() // wont work
$hello = 'hello'; $hello() // will work

编辑它似乎 {''}() 不起作用。我记得它曾经>.<

于 2009-05-21T22:03:52.340 回答