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

tho*_*ter 29 php arrays null

在PHP中,我已经error_reporting开始报告包括通知在内的所有内容.

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

$myarray = null;
$myvalue = $myarray['banana'];
Run Code Online (Sandbox Code Playgroud)

故障排除步骤

$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?
Run Code Online (Sandbox Code Playgroud)

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

Nar*_*arf 10

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

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

目前未定义自动转换为数组的行为.

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


小智 8

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

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

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

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

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


Mik*_*lev 6

从2006年开始有一个有效的错误报告

在文档中,这是关于“ 字符串”部分的通知。 在此处输入图片说明