您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

来自PHP 手册的丰富智慧:

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

来自PHP 文档

如果变量不存在,则不会生成警告。这意味着 本质上是等价于。

这意味着您只能使用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认情况下甚至不会报告,但手册建议在开发过程中允许。

处理问题的方法

PHP //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 合并运算符:

PHP // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';

PHP set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)

PHP error_reporting( error_reporting() & ~E_NOTICE )

强烈建议只实施第 1 点。

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

处理问题的方法

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

PHP list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');

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

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

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

php 2022/1/1 18:42:28 有397人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶