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

时间:2012-06-12 03:49:58

标签: php arrays null

在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中的一个错误,或者我只是不了解它是如何工作的。

3 个答案:

答案 0 :(得分:10)

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

但是,正如the manual page about type juggling所解释的那样,在处理像数组这样的非数组时并非如此:

  

当前未定义自动转换为数组的行为。

实际上,通过解除引用非数组触发此“未定义行为”时发生的行为是null被返回,正如您所观察到的那样。这不仅会影响空值 - 如果您尝试取消引用某个数字或资源,也会获得null

答案 1 :(得分:8)

使用 array derefence 语法可能有三种类型:

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

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

数组取消引用由FETCH_DIM_R opcode处理,zend_fetch_dimension_address_read()使用{{3}}来获取元素。

如您所见,NULL有一个特殊情况,默认情况下都返回未定义变量

答案 2 :(得分:6)

2006年开始有一个活跃的bug report

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