как избавиться здесь от уведомления PHP?[закрыто]

StackOverflow https://stackoverflow.com/questions/895188

  •  23-08-2019
  •  | 
  •  

Вопрос

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

редактировать, кажется, {''}() не работает.я помню, раньше это было >.<

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top