题
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的使用 - 假定 'T1' 中d:第11行\ jobirn \测试\ str.php
PHP说明:未定义常数T2的使用 - 假定 'T2' 中d:第11行\ jobirn \测试\ str.php
我怎样才能摆脱这些声明的? 12
解决方案
您得到通知,因为PHP不把函数作为第一类对象。 当你做到这一点。
$functions = array(t1, t2);
在PHP引擎看到T1和T2,并试图解决它作为一个常量,而是因为它不能找到一个常数名为T1 / T2,它“假设”,你想输入阵列(“T1”,“T2 “); 如果你做的var_dump($函数),你可以看到,数组中的项目都是字符串。
当您尝试调用一个字符串的函数,如
$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可用,这就是所谓的阵列解引用。
其他提示
$funcs = array('t1','t2');
直观,但它是如何工作
在工作轮的这个问题是从
改变php.ini设置error_reporting = E_ALL
到
error_reporting = E_ALL & ~E_NOTICE
检查出的error_reporting()函数:
http://us2.php.net/manual/en /function.error-reporting.php
它允许您配置显示什么错误,通知水平和警告。
例如,如果你想要错误和警告,并没有通知:
使用error_reporting(E_ERROR | E_WARNING);
使用如果你的意思是字符串字符串声明的:
$funcs = array('t1','t2');
也参见varaible功能href="http://docs.php.net/manual/en/functions.variable-functions.php" rel="nofollow noreferrer">章的在PHP手册
要使用字符串来调用一个函数,你应该用花括号
'hello'() // wont work
$hello = 'hello'; $hello() // will work
修改似乎{'}()不工作。我记住它用来>。<