Что означает сообщение об ошибке PHP «Notice: использование неопределенной константы»?

#php #laravel

#php #массивы #константы #не определено

Вопрос:

PHP записывает эту ошибку в журналы: «Notice: использование неопределенной константы».

Ошибка в журналах:

 PHP Notice:  Use of undefined constant department - assumed 'department' (line 5)
PHP Notice:  Use of undefined constant name - assumed 'name' (line 6)
PHP Notice:  Use of undefined constant email - assumed 'email' (line 7)
PHP Notice:  Use of undefined constant message - assumed 'message' (line 8)
  

Соответствующие строки кода:

 $department = mysql_real_escape_string($_POST[department]);
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
$message = mysql_real_escape_string($_POST[message]);
  

Что это значит и почему я это вижу?

Ответ №1:

department подразумевается строка (которая будет использоваться здесь в качестве ключа массива). Строки в PHP должны быть заключены в кавычки. В давние времена PHP неохотно использовал кавычки для строк из одного слова, но эти дни давно прошли.

Следовательно, это должно быть 'department' или "department" .

То же самое относится и к другим ошибкам.

Как есть, он искал константы с именем department , name , email , message , и т.д. Когда он не находит такую константу, PHP (странно) интерпретирует ее как строку (‘department’ и т. Д.), Но предупреждает вас об этом. Очевидно, что это может легко сломаться, если вы определите такую константу позже (хотя использовать константы в нижнем регистре — плохой стиль).

Комментарии:

1. Это не относится конкретно к $_POST . То же самое произойдет и с другими ассоциативными массивами.

2. @Col. Шрапнель, когда я говорил, что нужно заключать в кавычки только ключи массива? Ему нужно заключать ключи в кавычки, но не только их.

3. ну, я имею в виду, что нет необходимости заключать в кавычки ключи массива . нужно заключать в кавычки строки, а не ключи массива. ключ не требует специальных кавычек.

4. Это не «странно»… Это «обратная совместимость». Изначально PHP разрешал и даже продвигал использование строк без кавычек в качестве ключей. (Хорошо, может быть, это все еще «странно». 🙂

5. @BrianWhite Забавный факт, предлагая отказаться от этой функции , я не смог найти никаких доказательств того, что она когда-либо официально поощрялась, и только бета-версии PHP 3.0 включали поведение без уведомления, поэтому оно, похоже, обратно совместимо с функцией, которая никогда не была выпущена. В любом случае, оно исчезнет в PHP 8.0, когда бы оно ни появилось.

Ответ №2:

Сообщение об ошибке связано с тем печальным фактом, что PHP неявно объявляет неизвестный токен как постоянную строку с тем же именем.

То есть он пытается интерпретировать это (обратите внимание на пропущенные кавычки):

 $_POST[department]
  

Единственный допустимый способ, которым это было бы допустимым синтаксисом в PHP, — это если ранее department была определена константа. К сожалению, вместо того, чтобы умереть с фатальной ошибкой на этом этапе, он выдает это уведомление и действует так, как если бы константа была определена с тем же именем и значением:

 // Implicit declaration of constant called department with value 'department'
define('department', 'department');  
  

Существуют различные способы получения этого сообщения об ошибке, но все они имеют одну и ту же основную причину — токен, который может быть константой.

Строки, в которых отсутствуют кавычки: $my_array[bad_key]

Вот в чем проблема в вашем случае, и это потому, что у вас есть ключи строкового массива, которые не были заключены в кавычки. Исправление строковых ключей исправит ошибку:

Изменить:

 $department = mysql_real_escape_string($_POST[department]);
...(etc)...
  

Для:

 $department = mysql_real_escape_string($_POST['department']);
...(etc)...
  

В переменной отсутствует знак доллара: var_without_dollar

Еще одна причина, по которой вы можете увидеть это сообщение об ошибке, заключается в том, что вы не указываете $ из переменной или $this-> из члена. Например, любое из следующих действий приведет к появлению аналогичного сообщения об ошибке:

 my_local;   // should be $my_local
my_member;  // should be $this->my_member
  

Недопустимый символ в имени переменной: $bad-variable-name

Аналогичная, но более тонкая проблема может возникнуть, если вы попытаетесь использовать запрещенный символ в имени переменной — дефис ( - ) вместо подчеркивания _ будет обычным случаем.

Например, это нормально, поскольку символы подчеркивания разрешены в именах переменных:

 if (123 === $my_var) {
  do_something();
}
  

Но это не:

 if (123 === $my-var) {
  do_something();
}
  

Это будет интерпретироваться так же, как это:

 if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}
  

Ссылка на константу класса без указания области видимости класса

Чтобы ссылаться на константу класса, вам нужно указать область видимости класса :: , если вы пропустите это, PHP подумает, что вы говорите о глобальном define() .

Например:

 class MyClass {
  const MY_CONST = 123;

  public function my_method() {
    return self::MY_CONST;  // This is fine
  }


  public function my_method() {
    return MyClass::MY_CONST;  // This is fine
  }

  public function my_bad_method() {
    return MY_CONST;  // BUG - need to specify class scope
  }
}
  

Использование константы, которая не определена в этой версии PHP или определена в расширении, которое не установлено

Существуют некоторые системные константы, которые существуют только в более новых версиях PHP, например, константы параметра mode для round() таких, PHP_ROUND_HALF_DOWN которые существуют только в PHP 5.3 или более поздней версии.

Итак, если вы попытались использовать эту функцию в PHP 5.2, скажем:

 $rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);
  

Вы получите это сообщение об ошибке:

Использование неопределенной константы PHP_ROUND_HALF_DOWN — предполагаемое предупреждение ‘PHP_ROUND_HALF_DOWN’ (2): неправильное количество параметров для round()

Комментарии:

1. Без каких-либо сомнений, этот ответ является более полным, чем другие, и заслуживает значка «Лучший ответ»! Я слишком пропустил область видимости класса и в итоге получил некоторую ценную информацию на будущее. Спасибо, Джон!