这个错误信息的作用是帮助PHP程序员发现访问一个不存在的变量(或数组元素)时产生的拼写错误或其他错误。因此一个好的程序员:
- 确保每个变量或数组键在使用之前已经定义。如果需要在函数内部使用变量,则必须将其作为参数传递给该函数。
- 注意这个错误并修复它,就像处理其他任何错误一样。这可能表示拼写错误或某些过程没有返回它应该返回的数据。
- 仅在极少数情况下,当事情不在程序员的控制之下时,可以添加代码来规避此错误。但绝不能成为机械而盲目的习惯。
Notice / Warning: Undefined variable
虽然PHP不要求变量声明,但建议这么做以避免一些安全漏洞或漏掉给变量赋值的bug,导致在脚本后期使用变量时忘记给予初值等问题。在变量未声明的情况下,PHP会发出E_WARNING
级别的错误。
这个警告可以帮助程序员找出拼写错误的变量名称或类似的错误(例如一个变量在计算为假时被赋值)。除此之外,未初始化变量可能存在其他问题。正如 PHP 手册中所述的那样:
依赖未初始化变量的默认值在包含一个文件到另一个文件时使用相同的变量名会出现问题。
这意味着变量可能会从被包含的文件中获取值,并且将使用该值代替访问未初始化变量时预期的 null
值,这可能导致不可预测的结果。为避免这种情况,最好在使用之前初始化 PHP 文件中的所有变量。
处理这个问题的方法:
建议:在使用变量之前先声明。这样,只有在实际犯错并尝试使用不存在的变量时,您才会看到此错误 - 这正是此错误消息存在的原因。
//初始化一个变量
$value = ""; //初始化值;int为0,array为[]等
echo $value; //没有错误
echo $vaule; //错误指出了拼写错误的变量名
使用 null 合并运算符来抑制错误。但请记住,以这种方式使用 PHP 将无法向您通知使用错误的变量名。
// Null 合并运算符
echo $value ?? '';
对于古老的 PHP 版本(< 7.0),可以使用 isset() 和三元运算符。
echo isset($value) ? $value : '';
注意:尽管它仅用于屏蔽一个特定的错误,但它仍然实质上是一种错误抑制方法。因此,它可能会防止 PHP 帮助您标记未初始化的变量。
使用 @ 运算符 抑制错误。由于历史原因而保留,但严重来说,这应该不会发生。
注意:强烈建议只实现第1点。
注意:未定义索引/未定义偏移/警告:未定义数组键
当您(或 PHP)尝试访问数组的未定义索引时,将出现此提示/警告。
内部数组
处理内部数组时,应采取完全相同的态度:在使用之前仅初始化所有键。这样,这个错误会完成其既定任务:通知程序员其代码中的错误。因此,方法相同:
建议:声明数组元素:
$array['value'] = "";
echo $array['value'];
echo $array['vaule'];
一个特殊情况是当某个函数返回数组或其他值,例如
null
或
false
。在尝试访问数组元素之前,必须进行测试。
$row = $stmt->fetch();
if ($row) { // the record was found and can be worked with
echo $row['name'];
}
外部数组
对于外部数组(例如 $_POST
/ $_GET
/ $_SESSION
或 JSON 输入),情况有所不同,因为程序员无法控制这些数组的内容。因此,检查某些键是否存在,甚至为缺失的键分配默认值是可以被证明是合理的。
当一个 PHP 脚本包含一个 HTML 表单时,第一次加载时自然没有表单内容。因此,这样的脚本应该检查是否提交了表单
// 对于 POST 表单,请检查请求方法
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 处理表单
}
// 对于 GET 表单/链接,请检查重要字段
if (isset($_GET['search'])) {
// 处理表单
}
一些 HTML 表单元素(如复选框)如果未被选中,则不会发送到服务器。在这种情况下,使用空合并运算符分配默认值是合理的
$agreed = $_POST['terms'] ?? false;
可选的查询字符串元素或 cookie 应该以相同的方式处理
$limit = $_GET['limit'] ?? 20;
$theme = $_COOKIE['theme'] ?? 'light';
但是赋值应该在脚本的开头完成。
验证所有输入,将其分配给本地变量,并在代码中使用它们。 因此,您要访问的每个变量都会有意存在。
相关:
and-notice-undef
。这只是一些建议。它只是重复自己,并且是“注意:未定义”。 - Funk Forty Niner