function t1()
{
echo 1;
}
function t2()
{
echo 2;
}
$funcs = array(t1,t2);
$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}当我执行这个小php文件时:
注意:在第11行的D:\jobirn\test\str.php中使用未定义的常量t1 -假定为't1‘
注意:在第11行的D:\jobirn\test\str.php中使用未定义的常量t2 -假定为't2‘
我怎样才能摆脱这些通知呢?
发布于 2009-05-21 21:48:09
您会注意到这一点,因为PHP不会将函数视为第一类对象。当你这样做的时候
$functions = array(t1, t2);PHP引擎看到数组和t2,并试图将其解析为常量,但是因为它找不到名为t1/t2的常量,所以它“假定”您想要键入t1 (‘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-21 21:17:20
$funcs = array('t1','t2');不直观,但这就是它的工作方式
发布于 2009-05-21 21:16:02
解决此问题的方法是将php.ini设置从
error_reporting = E_ALL 至
error_reporting = E_ALL & ~E_NOTICEhttps://stackoverflow.com/questions/895188
复制相似问题