как избавиться здесь от уведомления PHP?[закрыто]
Вопрос
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:\jobirn est\str.php в строке 11.
Примечание PHP:Использование неопределенной константы t2 — предполагается «t2» в D:\jobirn est\str.php в строке 11.
Как я могу избавиться от этих уведомлений?12
Решение
Вы получаете уведомление, потому что 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 и называется разыменованием массива.
Другие советы
$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');
См. также глава о переменных функциях в руководстве PHP.
чтобы использовать строки для вызова функции, вам следует использовать фигурные скобки
'hello'() // wont work
$hello = 'hello'; $hello() // will work
редактировать, кажется, {''}() не работает.я помню, раньше это было >.<