2

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

假设我有以下数组:$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 上。

4

1 回答 1

5

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

于 2011-02-07T16:11:18.040 回答