小编典典

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

all

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

注意:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name

注意:未定义的索引:第 11 行的 my_index C:\wamp\www\mypath\index.php

警告:第 11 行 C:\wamp\www\mypath\index.php 中未定义的数组键“my_index”

第 10 和 11 行如下所示:

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

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

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

我该如何修复它们?


这是一个一般参考问题 ,供人们链接到重复,而不是一遍又一遍地解释问题。我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都是非常具体的。

相关元讨论:


阅读 189

收藏
2022-02-25

共1个答案

小编典典

注意/警告:未定义的变量

来自PHP
手册
的浩瀚智慧:

在将一个文件包含到另一个使用相同变量名的文件中的情况下,依赖未初始化变量的默认值是有问题的。开启register_globals也是一个主要的安全风险。在使用未初始化变量的情况下会发出E_NOTICE级别错误,但在将元素附加到未初始化数组的情况下则不会。isset()语言结构可用于检测变量是否已经初始化。此外,更理想的是empty()的解决方案,因为如果变量未初始化,它不会生成警告或错误消息。

来自PHP 文档

如果变量不存在,则不会生成警告。这意味着 empty() 本质上等同于 !isset($var) || $var == 假

这意味着您只能使用empty()来确定变量是否已设置,此外它还会根据以下内容检查变量,0, 0.0, "",
"0",或。null``false``[]

例子:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

在3v4l.org 在线 PHP
编辑器中测试上面的代码片段

尽管 PHP 不需要变量声明,但它确实推荐它,以避免一些安全漏洞或错误,即人们会忘记为稍后将在脚本中使用的变量赋值。PHP
在未声明变量的情况下所做的是发出一个非常低级别的错误,E_NOTICE默认情况下甚至不报告,但手册建议在开发期间允许

处理问题的方法:

  1. 推荐: 声明您的变量,例如当您尝试将字符串附加到未定义的变量时。或者使用isset()/!empty() 在引用它们之前检查它们是否已声明,如:
    //Initializing variable
    

    $value = “”; //Initialization value; Examples
    //”” When you want to append stuff later
    //0 When you want to add numbers later
    //isset()
    $value = isset($_POST[‘value’]) ? $_POST[‘value’] : ‘’;
    //empty()
    $value = !empty($_POST[‘value’]) ? $_POST[‘value’] : ‘’;

从 PHP 7.0 开始,这变得更加简洁,现在您可以使用null coalesce
运算符

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 为 E_NOTICE设置一个自定义错误处理程序并将消息从标准输出重定向(可能到日志文件):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. 从报告中禁用 E_NOTICE。一种快速排除的方法E_NOTICE是:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 使用@ 运算符抑制错误。

注意: 强烈建议只执行第 1 点。

注意:未定义的索引/未定义的偏移量/警告:未定义的数组键

当您(或 PHP)尝试访问数组的未定义索引时,会出现此通知/警告。

处理问题的方法:

  1. 在访问它之前检查索引是否存在。为此,您可以使用isset()array_key_exists()

    //isset()
    

    $value = isset($array[‘my_index’]) ? $array[‘my_index’] : ‘’;
    //array_key_exists()
    $value = array_key_exists(‘my_index’, $array) ? $array[‘my_index’] : ‘’;

  2. 当语言结构list()试图访问一个不存在的数组索引时,它可能会生成这个:

    list($a, $b) = array(0 => 'a');
    

    //or
    list($one, $two) = explode(‘,’, ‘test string’);

两个变量用于访问两个数组元素,但是只有一个数组元素 index 0,所以这将生成:

注意:未定义的偏移量:1

$_POST//变量$_GET_$_SESSION

$_POST使用,$_GET或时经常出现上述注意事项$_SESSION。对于$_POST并且$_GET您只需要在使用它们之前检查索引是否存在。因为$_SESSION您必须确保会话已开始session_start()并且索引也存在。

另请注意,所有 3
个变量都是超全局变量并且是大写的。

2022-02-25