题 当我将null值视为这样的数组时,为什么PHP不会抱怨?


在PHP中,我有 error_reporting 设置报告包括通知在内的所有内容。

为什么以下内容不会抛出任何通知,错误或其他任何内容?

$myarray = null;
$myvalue = $myarray['banana'];

故障排除步骤

$myarray = array();
$myvalue = $myarray['banana'];
// throws a notice, as expected 

$myarray = (array)null;
$myvalue = $myarray['banana'];
// throws a notice, as expected 

$myarray = null;
$myvalue = $myarray['banana'];
// no notice or warning thrown, $myvalue is now NULL. ✘ Why?

这可能是PHP中的一个错误,或者我只是不了解它是如何工作的。


25
2018-06-12 03:49


起源


PHP并不是最真实的 合乎逻辑 语言涉及到数据类型: me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design - Blender
我同意@Blender:它通常会根据它所知道的做出最有意义的做法。只要不打扰任何有轻微错误的人,这通常很方便。 - wallyk
哇 - 我已经使用PHP多年了,直到今天还没有被这种疯狂所困扰。快速测试表明,这个疯狂的设计决定在PHP 7中保持不变。:( - Mark Amery
你甚至可以这样做: <?php null['banana']; 这不是一个错误。我想这与使用保存空值的变量是一回事,但它看起来非常奇怪。和Mark一样,我在使用PHP几年后才遇到这个问题,我很惊讶。 - Rafał G.


答案:


有一个活跃的 错误报告 始于2006年。

在文档中,它是关于此的通知  部分。 enter image description here


4
2017-08-04 15:22



那很棒。据我所知,当我写这篇文章时没有在文档中(或者我可能因为它在字符串部分中而错过了它),所以非常感谢添加/提交的人。 - thomasrutter


通常,当您尝试使用一种类型的值时,就好像它是另一种类型一样,会抛出错误或警告,或者发生“类型杂耍”。例如,如果您尝试将两个数字连接起来 .,他们都会受到强制攻击并连接起来。

但是,如上所述 关于类型杂耍的手册页,在处理像数组这样的非数组时不是这种情况:

现在未定义自动转换为数组的行为。

实际上,通过解除引用非数组触发此“未定义行为”时发生的行为就是这种情况 null 如你所见,你会被归还。这不仅影响空值 - 你也会得到 null 如果您尝试取消引用某个数字或资源。


9
2018-06-12 05:15



感谢Narf,早些时候错过了Type Juggling页面的那一部分。如果遇到“未定义”的行为,你会认为发出警告或通知本身就是一个有用的设计选择。 - thomasrutter
好吧,我更喜欢PHP更严格,但是...这是一种独特的功能,我认为他们不会很快愿意弃用。 - Narf
我不希望他们弃用任何东西,只是抛出通知或警告,以便与其他时间访问不存在的数组索引一致,并警告开发人员可能存在的错误。 - thomasrutter
在评估中没有任何类型的杂耍 $myarray['banana'] (通过引用文档在本回答中正确公开)。 PHP源代码就是证明。解释和链接由提供 这个答案。 - axiac


使用它有三种类型可能是有效的 阵列derefence 语法:

  • 数组
  • 字符串(访问给定位置的字符)
  • 对象(实现ArrayAccess接口的对象)

对于所有其他类型,PHP只返回 未定义的变量

数组解除引用由。处理 FETCH_DIM_R操作码,使用 zend_fetch_dimension_address_read() 获取元素。

正如您所看到的,有一个特殊情况的NULL和一个默认情况,都返回 未定义的变量


7
2018-05-08 10:07



这是正确答案,评价时没有类型杂耍 $myarray['banana']。 - axiac