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