PHP 错误消息“注意:使用未定义的常量”是什么意思?

What does the PHP error message "Notice: Use of undefined constant" mean?

提问人:Nik 提问时间:5/31/2010 最后编辑:MachavityNik 更新时间:2/6/2023 访问量:799337

问:

PHP 在日志中写入此错误:“注意:使用未定义的常量”。

日志中的错误:

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]);

这是什么意思,为什么我会看到它?

PHP 数组常 undefined

评论


答:

256赞 Matthew Flaschen 5/31/2010 #1

department应该是一个字符串(在这里用作数组键)。PHP 中的字符串必须用引号括起来。在很久以前,PHP对单字字符串使用引号是松懈的,但现在的日子早已一去不复返了。

因此,它必须是 或 。'department'"department"

其他错误也是如此。

照原样,它正在寻找称为 、 等的常量。当它没有找到这样的常量时,PHP(奇怪地)将其解释为字符串(“department”等),但会警告你。显然,如果您稍后定义了这样的常量,这很容易被破坏(尽管使用小写常量是不好的风格)。departmentnameemailmessage

评论

1赞 Hammerite 5/31/2010
它并不特指 _POST 美元。同样的事情也会发生在其他关联数组上。
3赞 Matthew Flaschen 11/6/2011
@Col. 弹片,我什么时候说过只需要引用数组键?他确实需要引用密钥,但不仅仅是它们。
2赞 Your Common Sense 11/6/2011
好吧,我的意思是不需要引用数组键。必须引用字符串,而不是数组键。密钥不需要特殊引用。
5赞 Brian White 10/13/2012
这并不“奇怪”......它是“向后兼容”的。PHP 最初允许甚至推广使用不带引号的字符串作为键。(好吧,也许它仍然很“奇怪”。
4赞 IMSoP 1/30/2018
@BrianWhite 有趣的是,当提议弃用此功能时,我找不到任何证据表明它曾经被官方鼓励过,而且只有 PHP 3.0 的 beta 版本在没有通知的情况下包含了该行为,因此它似乎向后兼容从未发布的功能。无论如何,无论何时出现,它都会在 PHP 8.0 中消失。
95赞 John Carter 11/6/2011 #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

您可能会看到此错误消息的另一个原因是,如果您省略了 from 变量或成员。例如,以下任一情况都会导致类似的错误消息:$$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 中,例如 round() 的 mode 选项常量,例如只存在于 PHP 5.3 或更高版本中。PHP_ROUND_HALF_DOWN

因此,如果您尝试在 PHP 5.2 中使用此功能,请说:

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

您会收到以下错误消息:

使用未定义的常量PHP_ROUND_HALF_DOWN - 假定 “PHP_ROUND_HALF_DOWN”警告 (2):round() 的参数计数错误

评论

4赞 Harish ST 6/23/2019
毫无疑问,这个答案比其他答案更全面,值得最佳答案徽章!我太错过了课程范围,最终获得了一些对未来有价值的信息。谢谢,约翰!