【问题标题】:How strict is undefined index?未定义索引有多严格?
【发布时间】:2011-06-22 20:15:07
【问题描述】:

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

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

【问题讨论】:

  • 这很可能是因为 [] 字符串访问语法和类型杂耍。 $a = array('test' => array(), 'foo' => 'bar') 会给你一个错误
  • 哈哈,感谢您编辑了由先前的 copyedit @Piskvor 引起的奇怪结构。 :P
  • 啊,所以你的意思是,当它执行if($a['test']['nothere']) 时,它会到达if($a['test']),看到解析为false,然后短路?

标签: php multidimensional-array undefined-index


【解决方案1】:

这是因为棘手的类型杂耍。 $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 个类型转换,最终得到了这样的结果。
(提示:提出这个问题的可怜人已经注册了全局变量)

【讨论】:

  • +1 所以在检查变量时应该使用 isset(可能是数组,字符串等等)
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 2012-12-08
  • 2019-06-29
  • 2012-09-18
  • 1970-01-01
  • 2015-02-19
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多