为什么将整数视为数组($ int [$ index])不会在PHP中引发任何错误?

时间:2018-02-14 19:31:31

标签: php arrays error-handling

出于好奇,这只是一个简单的问题。我花了整整一天调试我的PHP代码,发现问题是由于将整数视为数组:

$x = $int[$index]; // this returns null, but no error at all

整数实际上是一个数组,但是用于传递数组的函数搞砸了并传递了数组中的第一个值。是否有任何原因未显示错误?访问数组上的未定义索引会产生错误,但尝试访问整数上不存在的索引不会?

3 个答案:

答案 0 :(得分:4)

我原本以为是;它将$int转换为字符串,因为[]是访问字符串位置的另一种方式。似乎有理由认为这不会产生错误:

$string 'Hello';
echo $string[0]; // H

然而,事实并非如此:

$int = 1;
echo $int[0];

不输出任何内容,var_dump($int[0])返回NULL

有趣的是,boolfloat表现出相同的行为,使用的操作是FETCH_DIM_R获取“数组”中“index”处元素的值-value“将其存储在”结果“中。

从手册Arrays

  

注意:取消引用不是string的标量值的数组会产生 NULL ,即不会发出错误消息。

与此现象类似,不会产生错误。错误#68110#54556

$array['a'] = null;
echo $array['a']['non-existent'];

分配不起作用并不奇怪:

$int = 1;
$int[0] = 2;
  

警告:不能将标量值用作数组

因此,PHP实际上是在尝试作为数组访问intboolfloat但不会生成错误。这至少是4.3.0到7.2.2版本。

答案 1 :(得分:1)

与我原来的理论相反,您正在调用未定义的行为,这种行为实际上是定义in the Array documentation

  

注意:
  取消引用不是字符串的标量值的数组静默产生NULL,即不发出错误消息。

在这种情况下,似乎根本没有类型杂耍发生,所以这些关于转换为数组的文档引用对理解这一点并不有用。

明确转换为数组is defined

  

对于任何类型integer,float,string,boolean和resource,将值转换为数组会产生一个数组,其中包含索引为零的单个元素以及已转换的标量值。换句话说,(数组)$ scalarValue与数组($ scalarValue)完全相同。

根据{{​​3}}

自动转换为数组未定义。

  

注意:
  自动转换为数组的行为目前尚未定义。

起初我认为这就是在这种情况下发生的情况,但是由于salathe指出这种行为在其他地方有记录,我不确定"自动转换为数组"是

至于为什么这会给你一个空值而不会抛出错误,警告或通知,这就是PHP解释器的实现方式,以及为什么 是在这种情况下,它并不是真的可以回答的问题。您必须询问开发人员,他们可能会告诉您。

答案 2 :(得分:-2)

这是"类型杂耍" ,"功能" PHP。

您可以在official doc

中阅读更多内容

修改 根据文档,"自动转换为数组的行为目前尚未定义。"

为了好奇,我进行了快速测试:

<?php
$int = 1;
$index = 0; 
$x = $int[$index]; 
echo gettype($int[$index]) . PHP_EOL; 
var_dump($x);

并且输出显示gettype()返回NULL,所以我想,在这种情况下,转换为NULL