php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

标签 php arrays variables warnings undefined-index

我正在运行 PHP 脚本并继续收到如下错误:

Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php on line 10

Notice: Undefined index: my_index C:\wamp\www\mypath\index.php on line 11

Warning: Undefined array key "my_index" in C:\wamp\www\mypath\index.php on line 11

第 10 行和第 11 行如下所示:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

这些错误消息的含义是什么?

为什么会突然出现?我多年来一直使用这个脚本,从来没有遇到过任何问题。

我该如何修复它们?


This is a General Reference question for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.

Related Meta discussion:

最佳答案

通知/警告: undefined variable

虽然 PHP 不需要变量声明,但它确实建议这样做,以避免一些安全漏洞或错误,这些漏洞或错误会忘记为稍后将在脚本中使用的变量赋值。 PHP 在未声明变量的情况下所做的是发出 E_WARNING 级别的错误。

此警告可帮助程序员发现拼写错误的变量名称或类似类型的错误(例如,变量在条件内被赋值但计算结果为 false)。此外,未初始化的变量还有其他可能的问题。因为它是stated在 PHP 手册中,

Relying on the default value of an uninitialized variable is problematic in the case of including one file into another which uses the same variable name.

这意味着一个变量可能会从包含的文件中获取一个值,并且这个值将被用来代替 null ,人们期望访问一个未初始化的变量,这可能会导致不可预测的结果。为避免这种情况,PHP 文件中的所有变量最好在使用前进行初始化。

处理问题的方法:

  1. 推荐:在使用之前声明每个变量。这样,只有当您实际犯错时才会看到此错误,尝试使用不存在的变量 - 这正是此错误消息存在的原因。

     //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
    
  2. 使用空合并运算符抑制错误。但请记住,这样 PHP 将无法通知您使用了错误的变量名。

     // Null coalescing operator
     echo $value ?? '';
    

    对于古老的 PHP 版本 (< 7.0) 可以使用带有三元的 isset()

     echo isset($value) ? $value : '';
    

    请注意,它本质上仍然是一种错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止 PHP 通过标记单元化变量来帮助您。

  3. @ operator 抑制错误.由于历史原因离开这里,但说真的,这不应该发生。

注意:强烈建议只实现第 1 点。

注意: undefined index / undefined offset /警告:未定义的数组键

当您(或 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

外部数组

对于外部数组(例如 $_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';
    

但是赋值应该在脚本的最开始完成。 验证所有输入*,将其分配给局部变量,并在代码中一直使用它们。因此,您要访问的每个变量都是有意存在的。

相关:

关于php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102934/

相关文章:

java - PHP 的 print_r 函数在 Java 中的等价物是什么?

php - Eclipse PDT Ant

php - 如何在 PHP 上获取根目录

php - JS OnClick 事件将执行 php 代码块

c++ - 使用不同线程访问不同子数组而不同步是否安全?

Javascript:检查字符串中匹配的关键字数组

c - 指向整数数组和普通整数数组的指针

arrays - Julia - 从 UInt8 数组读取 UInt32

python - 删除变量中的变量

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP