未定义索引有多严格?

How strict is undefined index?

提问人:Andrew 提问时间:2/7/2011 最后编辑:Piskvor left the buildingAndrew 更新时间:2/8/2011 访问量:681

问:

我已经打开了所有错误报告来清理一些未定义的索引,只是为了使我正在制作的应用程序更整洁。我注意到一个奇怪的行为:

假设我有以下数组:$a = array('test' => false, 'foo' => 'bar')

如果我这样做了,我会正确地收到通知。if ($a['nothere'])Undefined index: nothere

但是,如果我这样做了,我不会收到通知。完全。尽管绝对不是 .if ($a['test']['nothere'])nothere$a['test']

现在,如果我这样做了,那么跑步确实会抛出一个通知。$a['test'] = array('baz' => 'poof')if ($a['test']['nothere'])

未定义的索引检查是否不检查空数组中的索引?这是在 PHP 5.2.8 上。

php 多维数组 未定义索引

评论

1赞 Your Common Sense 2/8/2011
这很可能是因为 [] 字符串访问语法和类型杂耍。 会产生错误$a = array('test' => array(), 'foo' => 'bar')
0赞 Andrew 2/8/2011
呵呵,谢谢你编辑掉了之前的文案编辑引起的奇怪的结构,@Piskvor。:P
0赞 Andrew 2/8/2011
啊,所以你是建议,当它发生时,它会走得最远,看到决心,然后短路?if($a['test']['nothere'])if($a['test'])false

答:

5赞 Your Common Sense 2/8/2011 #1

这是因为棘手的类型杂耍。 $a['test'] 被转换为 [空] 字符串,然后 'nowhere' 被转换为 0,然后 PHP 尝试在空字符串中查找 0 的符号。它变成了子字符串操作,而不是变量查找,因此不会引发错误。

哎呀,一个男人也这么说:http://php.net/manual/en/language.types.type-juggling.php

我的经验中有一个奇怪的例子:
通过超链接请求,一个代码
index.php?sname=p_edit&page=0

if (isset($_GET['sname'])) { $page['current'] = $_GET['sname'].'.php'; };
echo $page['current'];

只生成一个字母"p"

我数了 6 个步骤和 2 个类型铸件,最终得到了这样的结果。
(提示:一个问这个问题的可怜的家伙已经注册了全局变量)

评论

0赞 Poelinca Dorin 2/8/2011
+1 all所以你应该在检查变量时使用 isset(可能是数组、字符串)