Notice / Warning: Undefined variable
来自PHP Manual人的巨大智慧:
在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的.这也是一个主要的security risk与register_globals打开.在使用未初始化的变量时会发出E_NOTICE级错误,但在向未初始化的数组追加元素时不会发出E_NOTICE级错误.isset()语言构造可用于检测变量是否已初始化.此外,更理想的解决方案是empty(),因为如果变量未初始化,它不会生成警告或错误消息.
从PHP documentation开始:
如果变量不存在,则不会生成警告.这意味着
这意味着您只能使用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 online PHP editor中测试上面的代码片段
虽然PHP不需要变量声明,但它确实建议使用它,以避免出现一些安全漏洞或bug,人们可能会忘记为稍后将在脚本中使用的变量赋值.PHP在未声明变量的情况下所做的是发出一个非常低级别的错误E_NOTICE
,默认情况下甚至没有报告这个错误,但是在开发过程中会出现手册advises to allow.
处理这个问题的方法:
Recommended:声明变量,例如,当您try 将字符串附加到未定义的变量时.或者在引用它们之前,使用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'] ?? '';
将E_NOTICE设置为custom error handler,并将消息从标准输出重定向(可能指向日志(log)文件):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
禁用报告中的Electron 通知(_O).只排除E_NOTICE
个的快捷方法是:
error_reporting( error_reporting() & ~E_NOTICE )
使用@ operator suppress 错误.
Note:强烈建议只实施第1点.
Notice: Undefined index / Undefined offset / Warning: Undefined array key
当您(或PHP)try 访问数组的未定义索引时,会出现此通知/警告.
处理这个问题的方法:
在访问之前,请判断索引是否存在.为此,您可以使用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'] : '';
当语言构造list()
试图访问不存在的数组索引时,它可能会生成:
list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');
两个变量用于访问两个数组元素,但是只有一个数组元素,索引0
,因此这将生成:
注意:未定义的偏移量:1
#$_POST
/$_GET
/$_SESSION
变量
在使用$_POST
、$_GET
或$_SESSION
时,上面的注意事项经常出现.对于$_POST
和$_GET
,在使用它们之前,只需判断索引是否存在.对于$_SESSION
,您必须确保会话以session_start()
开头,并且索引也存在.
还要注意的是,这三个变量都是superglobals,都是大写的.
相关: