注意:未定义变量&q;,&q;注意:未定义索引&q;,&q;警告:未定义数组键&q;,以及&q;注意:使用PHP的未定义偏移量
我正在运行一个PHP脚本,但继续收到如下错误:
注意:第10行C:wampwwwmypathindex.php中的未定义变量:my_ariable_name
注意:第11行上的未定义索引:my_index C:wampwwwmypathindex.php
警告:第11行上C:wampwwwmypathindex.php中的未定义数组键&my_index";
第10行和第11行如下所示:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
这些错误消息的含义是什么?
为什么它们突然出现了?我使用此脚本已有多年,从未遇到过任何问题。
如何修复它们?
这是一个常规参考问题,人们可以重复链接到该问题,而不必反复解释该问题。我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都非常具体。
相关元讨论:
- What can be done about repetitive questions?
- Do "reference questions" make sense?
解决方案
注意/警告:未定义变量
来自PHP Manual的浩瀚智慧:
在将一个文件包含到使用相同变量名称的另一个文件中的情况下,依赖未初始化变量的默认值是有问题的。它也是打开了register_globals的主要security risk。E_NOTICE如果使用未初始化的变量,则会发出级别错误,但在将元素追加到未初始化的数组的情况下不会发出级别错误。isset()语言结构可用于检测变量是否已初始化。此外,更理想的是empty()的解决方案,因为如果变量未初始化,它不会生成警告或错误消息。
发件人PHP documentation:
如果变量不存在,则不会生成警告。这意味着 Empty()本质上相当于!isset($var)||$var ==FALSE。
这意味着您只能使用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 "
";
});
在3v4l.org online PHP editor
中测试上述代码段虽然PHP不需要变量声明,但它确实建议这样做,以避免某些安全漏洞或错误,因为您会忘记为稍后将在脚本中使用的变量赋值。对于未声明的变量,PHP所做的是发出一个非常低级别的错误E_NOTICE
,默认情况下甚至不会报告这个错误,但在开发过程中会根据手册advises to allow进行报告。
处理方法:
建议:声明变量,例如,当您尝试将字符串追加到未定义的变量时。或者使用
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_Notify设置custom error handler,并将消息从标准输出(可能是日志文件)重定向:
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
禁用E_Notify报告。仅排除
E_NOTICE
的快捷方法是:error_reporting( error_reporting() & ~E_NOTICE )
使用@ operator取消错误。
注意:强烈建议仅实现第1点。
注意:索引未定义/偏移量未定义/警告:数组键未定义
当您(或PHP)尝试访问数组的未定义索引时,会出现此通知/警告。
处理方法:
在访问之前检查索引是否存在。为此,您可以使用
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');
使用两个变量访问两个数组元素,但只有一个数组元素index0
,因此将生成:
注意:未定义偏移量:1
#$_POST
/$_GET
/$_SESSION
变量
$_POST
、$_GET
或$_SESSION
时,经常会出现上述通知。对于$_POST
和$_GET
,您只需在使用它们之前检查索引是否存在。对于$_SESSION
,您必须确保会话以session_start()
开始,并且索引也存在。
还请注意,所有3个变量均为superglobals且为大写。
相关:
- Notice: Undefined variable
- Notice: Undefined Index
相关文章