我正在运行一个PHP脚本,但不断收到如下错误:
Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10
Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11
Warning: Undefined array key "my_index" in C:wampwwwmypathindex.php on line 11
第10行和第11行看起来是这样的:
echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];
这些错误信息的含义是什么?
为什么它们突然出现?我用这个脚本已经用了好几年了,以前从来没有出过任何问题。
如何修复这些错误?
试一下这个
或者,有一个快速而简单的解决方案:
这个错误信息旨在帮助PHP程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。因此,一个优秀的程序员应该:
注意/警告:未定义的变量
尽管PHP不要求变量声明,但建议进行声明,以避免一些安全漏洞或错误,其中一个人可能会忘记给一个变量赋值,而这个变量稍后会在脚本中使用。在未声明变量的情况下,PHP会发出一个E_WARNING级别的错误。
此警告帮助程序员发现拼写错误的变量名或类似的错误(例如,在条件求值为false时将变量赋值)。此外,未初始化变量可能存在其他可能的问题。正如PHP手册中所述,
这意味着变量可能从包含的文件中获取一个值,并且这个值将被用来替代访问未初始化变量时所期望的null值,这可能导致不可预测的结果。为了避免这种情况,最好在使用之前对PHP文件中的所有变量进行初始化。
处理这个问题的方法有以下几种:
推荐的方法是在使用之前声明每个变量。这样,只有在实际犯错尝试使用不存在的变量时,才会看到这个错误,这也是出现这个错误信息的原因。
一个特殊情况是当一个变量被定义但在函数中不可见。在PHP中,函数有自己的变量作用域,如果你需要在函数中使用外部的变量,它的值必须作为函数的参数传递进来:
使用空值合并运算符来抑制错误。但请记住,这样PHP将无法通知您使用了错误的变量名。
For the ancient PHP versions (< 7.0) isset() with ternary can be used
请注意,尽管这本质上是一种错误抑制,但仅适用于特定的错误。因此,它可能会阻止PHP通过标记未初始化的变量来帮助您。
使用@运算符来抑制错误。这里为了历史原因而保留,但严肃地说,这种情况本不应发生。
注意:强烈建议只实施第一点。
注意:未定义的索引/未定义的偏移量/警告:未定义的数组键
当您(或PHP)尝试访问数组的未定义索引时,会出现此提示/警告。
内部数组
在处理内部数组时,即在您的代码中定义的数组,应采取完全相同的态度:在使用之前初始化所有键。这样,这个错误就能够完成其预期的工作:通知程序员代码中的错误。因此,处理方法是相同的:
建议:声明数组元素:
特殊情况是当某个函数返回数组或其他值(如null或false)时。在尝试访问数组元素之前,必须进行测试,例如:
外部数组
对于外部数组(如$_POST / $_GET / $_SESSION或JSON输入),情况有所不同,因为程序员无法控制这些数组的内容。因此,检查某个键是否存在,甚至为缺失的键分配默认值是合理的。
当一个PHP脚本包含一个HTML表单时,很自然地,在第一次加载时没有表单内容。因此,这样的脚本应该检查是否提交了表单。
一些HTML表单元素,比如复选框,如果未被选中,则不会发送到服务器。在这种情况下,使用空合并运算符分配默认值是合理的。
可选的查询字符串元素或cookie应该以相同的方式处理。
但是赋值应该在脚本的最开始进行。验证所有的输入,将其赋值给本地变量,并在代码中一直使用它们。这样,你要访问的每个变量都会有意地存在。