如何在这里摆脱PHP通知?

时间:2009-05-21 21:11:59

标签: 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]();
}

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

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

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

如何摆脱这些通知? 12

6 个答案:

答案 0 :(得分:7)

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

$functions = array(t1, t2);

PHP引擎看到t1和t2,并尝试将其解析为常量,但由于找不到名为t1 / t2的常量,因此它“假设”您要键入数组('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中可用,它称为数组解除引用。

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

此问题的工作原理是从

更改php.ini设置
error_reporting = E_ALL 

error_reporting = E_ALL & ~E_NOTICE

答案 3 :(得分:0)

查看error_reporting()函数:

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

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

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

error_reporting(E_ERROR | E_WARNING);

答案 4 :(得分:0)

如果您指的是字符串,请使用string declarations

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

另请参阅PHP手册中的chapter on varaible functions

答案 5 :(得分:-1)

使用字符串来调用函数,你应该使用花括号

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

编辑似乎{''}()无效。我记得以前用过&gt;。&lt;