2011-02-07 93 views
1

我已经打开所有的错误报告来清理一些未定义的索引,只是为了让我的应用程序更加整洁。我注意到一个奇怪的现象:未定义索引有多严格?

比方说,我有以下阵列:$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上。

+1

这很可能是因为[]字符串访问语法和类型的杂耍。 `$ a = array('test'=> array(),'foo'=>'bar')`会产生一个错误 – 2011-02-07 16:03:19

+0

呵呵,谢谢编辑以前copyedit @Piskvor引起的奇怪结构。 :P – Andrew 2011-02-07 16:03:45

回答

4

这是因为棘手的类型杂耍。 $ a ['test']被转换为[空]字符串,然后'无处'被转换为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个类型演员,最后得出了这样的结果。
(提示:问这个问题的可怜的家伙注册了全局变量)