Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我像这样将空值作为数组处理时,PHP为什么不抱怨呢?_Php_Arrays_Null - Fatal编程技术网

当我像这样将空值作为数组处理时,PHP为什么不抱怨呢?

当我像这样将空值作为数组处理时,PHP为什么不抱怨呢?,php,arrays,null,Php,Arrays,Null,在PHP中,我将报告所有内容,包括通知 为什么下面的内容不会抛出任何通知、错误或其他内容 $myarray = null; $myvalue = $myarray['banana']; 故障排除步骤: $myarray = array(); $myvalue = $myarray['banana']; // throws a notice, as expected ✔ $myarray = (array)null; $myvalue = $myarray['banana']; // thro

在PHP中,我将报告所有内容,包括通知

为什么下面的内容不会抛出任何通知、错误或其他内容

$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,或者我只是不了解它是如何工作的。

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

但是,如上所述,当将非数组视为数组时,情况并非如此:

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


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

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

  • 阵列
  • 字符串(访问给定位置的字符)
  • 对象(实现ArrayAccess接口的对象)
对于所有其他类型,PHP只返回未定义的变量

数组解引用由处理,用于获取元素

正如您所看到的,NULLs有一种特殊情况,默认情况下都返回未定义的变量

从2006年开始有一个活动的

在文档中,这是一个关于这一点的通知。

PHP在数据类型方面并不是最符合逻辑的语言:我同意@Blender的观点:它通常做最有意义的事情,尽其所能做到最好。这通常非常方便,因为不会因为一些小错误而困扰任何人。哇,我已经使用PHP多年了,直到今天才被这种疯狂所困扰。快速测试表明,这种疯狂的设计决策在PHP 7中保持不变:(你甚至可以这样做:
谢谢你,Narf,错过了之前的类型转换页面的那一部分。不过,如果遇到“未定义”,你会认为抛出警告或通知对他们来说是一个有用的设计选择行为。嗯,我也希望PHP更严格一点,但是……这是一种独特的功能,我认为他们不会很快反对。我不希望他们反对任何东西,只要抛出一个通知或警告,以便与您访问不存在的数组索引的其他时间保持一致,并警告开发人员关于一个潜在的错误。
$myarray['banana']
的计算中没有类型转换(在这个答案中引用文档正确地揭示了这一点)。PHP源代码就是证明。解释和链接由提供。这是正确的答案,对
$myarray['banana']
的求值没有进行类型转换。那太好了。据我所知,我写这篇文章时文档中没有这一点(或者可能是因为它在字符串部分而错过了它),因此,感谢您添加/提交该文件的人。对于PHP7.4,现在将抛出通知: