栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

注意:未定义的变量

来自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()
    来检查它们是否已声明,如下所示:

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'] ?? '';

  1. 为 E_NOTICE设置自定义错误处理程序并将消息从标准输出(可能到日志文件)重定向:

php   set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)

  1. 禁用 E_NOTICE 报告。一种快速排除方法
    E_NOTICE
    是:

php   error_reporting( error_reporting() & ~E_NOTICE )

  1. 使用@ 运算符抑制错误。

注意:强烈建议只实施第 1 点。

注意:未定义索引/未定义偏移

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

处理问题的方法:

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

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

  1. 语言构造
    list()
    在尝试访问不存在的数组索引时可能会生成此信息:

php   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()
并且索引也存在。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号