31

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

4

3 回答 3

10

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

但是,正如关于 type juggling 的手册页中所解释的那样,将非数组视为数组时并非如此:

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

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

于 2012-06-12T05:15:35.487 回答
10

在以下三种类型上使用数组解除引用语法可能是有效的:

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

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

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

如您所见,NULL 有一种特殊情况,还有一种默认情况,它们都返回未定义的变量

于 2014-05-08T10:07:17.067 回答
8

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

在文档中,在String部分 中对此进行了通知。在此处输入图像描述

于 2016-08-04T15:22:05.093 回答