当我像这样把一个空值当作一个数组时,为什么PHP没有抱怨呢?

k5hmc34c  于 2022-11-21  发布在  PHP
关注(0)|答案(4)|浏览(159)

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

ahy6op9u

ahy6op9u1#

在以下三种类型上使用 array derefence 语法可能是有效的:

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

对于所有其他类型,PHP只返回 *undefined变量 *。
数组取消引用由FETCH_DIM_R操作码处理,它使用zend_fetch_dimension_address_read()来获取元素.
正如您所看到的,NULL有一种特殊情况,也有一种默认情况,两者都返回 *undefined变量 *。

u4dcyp6a

u4dcyp6a2#

通常,当你试图将一个类型的值当作另一个类型来使用时,要么会抛出错误或警告,要么会发生“类型欺骗”。例如,如果你试图用.连接两个数字,它们都会被强制为字符串并连接起来。
但是,如the manual page about type juggling中所述,当将非数组视为数组时,情况并非如此:
当前未定义自动转换为数组的行为。
实际上,当解引用一个非数组时,会出现null返回的情况,这不仅仅影响空值,如果你试图解引用一个数字或资源,也会得到null

b4wnujal

b4wnujal3#

有一个活跃的bug report开始于2006年。
在文档中,String部分中有关于此的通知。

gfttwv5a

gfttwv5a4#

从PHP 7.4开始,此行为会发出一个通知。“尝试访问null类型值的数组偏移量”
请参阅此7.4迁移页面中的第一项。https://www.php.net/manual/en/migration74.incompatible.php
最近,我的一位同事因为在尝试从变量访问列数据之前忽略了验证数据库查询的结果而受到了批评。

$results = $this->dbQuery(...)
if($results['columnName'] == 1)
{
    // WHEN $results is null, this Notice will be emitted.
}

我刚刚注意到@Glen的评论,上面,引用了相关的RFC。https://wiki.php.net/rfc/notice-for-non-valid-array-container

相关问题