此错误消息旨在 帮助 PHP 程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。因此,优秀的程序员应该:
-
确保每个变量或数组键在使用前都已定义。如果需要在函数内部使用变量,则必须将其作为参数传递给该函数。
-
关注此错误并着手修复它,就像修复其他错误一样。 它可能表示拼写错误或某些程序未返回应返回的数据。
-
只有在极少数情况下,当事情不在程序员的控制范围内时,才会添加代码来规避此错误。但这绝不应该是一种盲目的习惯。
注意/警告:未定义变量
尽管 PHP 不要求声明变量,但它还是建议声明变量,以避免某些安全漏洞或错误,因为有人可能会忘记为脚本中稍后要使用的变量赋值。在未声明变量的情况下,PHP 会发出级别错误 E_WARNING
。
此警告可帮助程序员发现拼写错误的变量名或类似错误(例如,在条件中为变量分配了一个值,但结果为 false)。此外,未初始化变量还可能存在其他问题。正如 PHP 手册中 所述
当将一个文件包含到使用相同变量名的另一个文件中时,依赖未初始化变量的默认值会产生问题。
这意味着变量可能会从包含的文件中获取一个值,并且将使用该值而不是 null
访问未初始化的变量所期望的值,这可能会导致不可预测的结果。为避免这种情况,最好在使用前初始化 PHP 文件中的所有变量。
处理问题的方法:
-
p6
//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
-
p8
// Null coalescing operator echo $value ?? '';
p9
echo isset($value) ? $value : '';
p10
-
p11
注意: 强烈建议仅实现第 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
或 ) false
。那么在尝试访问数组元素之前必须对其进行测试,例如
$row = $stmt->fetch();
if ($row) { // the record was found and can be worked with
echo $row['name'];
}
外部数组
对于外部数组(例如 $_POST
/ $_GET
/ $_SESSION
或 JSON 输入),情况会有所不同,因为程序员无法控制此类数组的内容。因此,检查某些键是否存在,甚至为缺失的键分配默认值都是合理的。
-
p18
// 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 }
-
第19页
$agreed = $_POST['terms'] ?? false;
-
p20
$limit = $_GET['limit'] ?? 20; $theme = $_COOKIE['theme'] ?? 'light';
但赋值应该在脚本一开始就完成。 验证所有输入 ,将其赋值给局部变量,并在代码中一直使用它们。因此,您要访问的每个变量都会故意存在。
有关的: