此错误消息的目的是helpPHP 程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。所以一个好的程序员:
- 确保每个变量或数组键在使用时都已定义。如果需要在函数内部使用变量,则必须将其作为参数传递给该函数。
-
请注意此错误并继续修复它,就像处理任何其他错误一样。它可能表示拼写错误或某些过程未返回应有的数据。
- 只有在极少数情况下,当事情不受程序员控制时,才可以添加代码来避免此错误。但这绝不应该是一种盲目的习惯。
注意/警告:未定义的变量
尽管 PHP 不需要变量声明,但它确实建议这样做,以避免一些安全漏洞或错误,即人们会忘记为稍后在脚本中使用的变量赋值。 PHP 在未声明变量的情况下会发出以下错误E_WARNING
level.
此警告可帮助程序员发现拼写错误的变量名称或类似的错误(例如在评估为 false 的条件内为变量分配了一个值)。此外,未初始化的变量还可能存在其他问题。就像它一样stated在 PHP 手册中,
在将一个文件包含到使用相同变量名的另一个文件中的情况下,依赖未初始化变量的默认值是有问题的。
这意味着变量可以从包含的文件中获取值,并且将使用该值而不是null
人们期望访问未初始化的变量,这可能会导致不可预测的结果。为了避免这种情况,PHP 文件中的所有变量最好在使用前进行初始化。
处理问题的方法:
-
受到推崇的:在使用之前声明每个变量。这样,只有当您确实犯了错误,尝试使用不存在的变量时,您才会看到此错误 - 这正是此错误消息存在的原因。
//Initializing a variable
$value = ""; //Initialization value; 0 for int, [] for array, etc.
echo $value; // no error
echo $vaule; // an error pinpoints a misspelled variable name
-
使用空合并运算符抑制错误。但请记住,这样 PHP 将无法通知您使用了错误的变量名。
// Null coalescing operator
echo $value ?? '';
对于古老的 PHP 版本(
echo isset($value) ? $value : '';
Be aware尽管如此,它本质上仍然是一种错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止 PHP 通过标记统一变量来帮助您。
-
使用以下命令抑制错误@ 操作员。由于历史原因而离开这里,但认真地说,这是不应该发生的。
Note:强烈建议仅实施第 1 点。
注意:未定义索引/未定义偏移量/警告:未定义数组键
当您(或 PHP)尝试访问数组的未定义索引时,会出现此通知/警告。
内部数组
当处理代码中定义的内部数组时,态度应该完全相同:只需在使用前初始化所有键。这样,该错误将完成其预期的工作:通知程序员其代码中的错误。所以方法是一样的:
受到推崇的:声明您的数组元素:
//Initializing a variable
$array['value'] = ""; //Initialization value; 0 for int, [] for array, etc.
echo $array['value']; // no error
echo $array['vaule']; // an error indicates a misspelled key
一种特殊情况是某些函数返回数组或其他值,例如null
or false
。然后在尝试访问数组元素之前必须进行测试,例如
$row = $stmt->fetch();
if ($row) { // the record was found and can be worked with
echo $row['name'];
}
外部数组
使用外部数组(例如$_POST
/ $_GET
/ $_SESSION
或 JSON 输入)情况有点不同,因为程序员无法控制此类数组的内容。因此,检查某些键是否存在,甚至为丢失的键分配默认值都是合理的。
-
当 PHP 脚本包含 HTML 表单时,第一次加载时很自然地没有表单内容。因此这样的脚本应该检查表单是否已提交
// for POST forms check the request method
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// process the form
}
// for GET forms / links check the important field
if (isset($_GET['search'])) {
// process the form
}
-
某些 HTML 表单元素(例如复选框)如果未选中,则不会发送到服务器。在这种情况下,有理由使用空合并运算符来分配默认值
$agreed = $_POST['terms'] ?? false;
-
可选的 QUERY STRING 元素或 cookie 应以相同的方式处理
$limit = $_GET['limit'] ?? 20;
$theme = $_COOKIE['theme'] ?? 'light';
但分配应该在脚本的一开始就完成。验证所有输入,将其分配给局部变量,并在代码中一直使用它们。因此,您要访问的每个变量都会故意存在。
Related: