在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,或者我只是不理解它是如何工作的。
4条答案
按热度按时间ahy6op9u1#
在以下三种类型上使用 array derefence 语法可能是有效的:
对于所有其他类型,PHP只返回 *undefined变量 *。
数组取消引用由FETCH_DIM_R操作码处理,它使用zend_fetch_dimension_address_read()来获取元素.
正如您所看到的,NULL有一种特殊情况,也有一种默认情况,两者都返回 *undefined变量 *。
u4dcyp6a2#
通常,当你试图将一个类型的值当作另一个类型来使用时,要么会抛出错误或警告,要么会发生“类型欺骗”。例如,如果你试图用
.
连接两个数字,它们都会被强制为字符串并连接起来。但是,如the manual page about type juggling中所述,当将非数组视为数组时,情况并非如此:
当前未定义自动转换为数组的行为。
实际上,当解引用一个非数组时,会出现
null
返回的情况,这不仅仅影响空值,如果你试图解引用一个数字或资源,也会得到null
。b4wnujal3#
有一个活跃的bug report开始于2006年。
在文档中,String部分中有关于此的通知。
gfttwv5a4#
从PHP 7.4开始,此行为会发出一个通知。“尝试访问null类型值的数组偏移量”
请参阅此7.4迁移页面中的第一项。https://www.php.net/manual/en/migration74.incompatible.php
最近,我的一位同事因为在尝试从变量访问列数据之前忽略了验证数据库查询的结果而受到了批评。
我刚刚注意到@Glen的评论,上面,引用了相关的RFC。https://wiki.php.net/rfc/notice-for-non-valid-array-container