为什么 PHP 在将 null 值视为这样的数组时不抱怨?

2022-08-30 14:38:52

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


答案 1

有三种类型,使用数组反比语法可能是有效的:

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

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

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

如您所见,NN 有一个特例,也有一个默认情况,两者都返回未定义的变量


答案 2

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

但是,正如手册页中关于类型杂耍的解释,在将非数组视为数组时,情况并非如此:

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

在实践中,当这种“未定义的行为”通过取消引用非数组触发时发生的行为是返回的,正如你所观察到的。这不仅会影响 nulls -如果您尝试取消引用数字或资源,也会得到 null。nullnull