出于好奇,这只是一个简单的问题。我花了整整一天调试我的PHP代码,发现问题是由于将整数视为数组:
$x = $int[$index]; // this returns null, but no error at all
整数实际上是一个数组,但是用于传递数组的函数搞砸了并传递了数组中的第一个值。是否有任何原因未显示错误?访问数组上的未定义索引会产生错误,但尝试访问整数上不存在的索引不会?
答案 0 :(得分:4)
$int
转换为字符串,因为[]
是访问字符串位置的另一种方式。似乎有理由认为这不会产生错误:
$string 'Hello';
echo $string[0]; // H
然而,事实并非如此:
$int = 1;
echo $int[0];
不输出任何内容,var_dump($int[0])
返回NULL
。
有趣的是,bool
和float
表现出相同的行为,使用的操作是FETCH_DIM_R
,获取“数组”中“index”处元素的值-value“将其存储在”结果“中。
从手册Arrays:
注意:取消引用不是string的标量值的数组会产生 NULL ,即不会发出错误消息。
与此现象类似,不会产生错误。错误#68110和#54556:
$array['a'] = null;
echo $array['a']['non-existent'];
分配不起作用并不奇怪:
$int = 1;
$int[0] = 2;
警告:不能将标量值用作数组
因此,PHP实际上是在尝试作为数组访问int
,bool
,float
但不会生成错误。这至少是4.3.0到7.2.2版本。
答案 1 :(得分:1)
与我原来的理论相反,您正在调用未定义的行为,这种行为实际上是定义in the Array documentation。
注意:
取消引用不是字符串的标量值的数组静默产生NULL,即不发出错误消息。
在这种情况下,似乎根本没有类型杂耍发生,所以这些关于转换为数组的文档引用对理解这一点并不有用。
明确转换为数组is defined。
根据{{3}}对于任何类型integer,float,string,boolean和resource,将值转换为数组会产生一个数组,其中包含索引为零的单个元素以及已转换的标量值。换句话说,(数组)$ scalarValue与数组($ scalarValue)完全相同。
自动转换为数组未定义。
注意:
自动转换为数组的行为目前尚未定义。
起初我认为这就是在这种情况下发生的情况,但是由于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