本文介绍了注意:未定义变量&q;,&q;注意:未定义索引&q;,&q;警告:未定义数组键&q;,以及&q;注意:使用PHP的未定义偏移量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行一个PHP脚本,但继续收到如下错误:

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

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

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

为什么它们突然出现了?我使用此脚本已有多年,从未遇到过任何问题。

如何修复它们?


推荐答案

注意/警告:未定义变量

来自PHP Manual的浩瀚智慧:

发件人PHP documentation

这意味着您只能使用empty()来确定是否设置了变量,此外,它还会根据以下各项检查变量:00.0"""0"nullfalse[]

示例:

$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 "
";
});

3v4l.org online PHP editor

中测试上述代码段

虽然PHP不需要变量声明,但它确实建议这样做,以避免某些安全漏洞或错误,因为您会忘记为稍后将在脚本中使用的变量赋值。对于未声明的变量,PHP所做的是发出一个非常低级别的错误E_NOTICE,默认情况下甚至不会报告这个错误,但在开发过程中会根据手册advises to allow进行报告。

处理方法:

  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 operator

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 为E_Notify设置custom error handler,并将消息从标准输出(可能是日志文件)重定向:

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. 禁用E_Notify报告。仅排除E_NOTICE的快捷方法是:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 使用@ operator取消错误。

注意:强烈建议仅实现第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');
    

使用两个变量访问两个数组元素,但只有一个数组元素index0,因此将生成:

#$_POST/$_GET/$_SESSION变量

在使用$_POST$_GET$_SESSION时,经常会出现上述通知。对于$_POST$_GET,您只需在使用它们之前检查索引是否存在。对于$_SESSION,您必须确保会话以session_start()开始,并且索引也存在。

还请注意,所有3个变量均为superglobals且为大写。

相关:

这篇关于注意:未定义变量&q;,&q;注意:未定义索引&q;,&q;警告:未定义数组键&q;,以及&q;注意:使用PHP的未定义偏移量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-19 15:18