PHP在对空变量进行索引时未引发未定义索引通知。

8
我很想知道PHP中以下行为是否是有意的。如果是有意的,那么通过在其中创建一个索引来从null变量初始化数组(如第一个代码片段所示)是否被认为是可接受的?
error_reporting(E_ALL);
$arr = null;

echo ($arr["blah"]===null) ? "null" : $arr["blah"];

$arr["blah"] = "somevalue";
echo "<br>";
echo ($arr["blah"]===null) ? "null" : $arr["blah"];
var_dump ($arr);

这将输出:
null
somevalue

array (size=1)
   'blah' => string 'somevalue' (length=9)

然而,如果数组先被初始化(见下面的代码),我会得到完全相同的输出,但是在第一次尝试使用$arr["blah"]时会出现“未定义索引”的提示。
error_reporting(E_ALL);
$arr = array();

echo ($arr["blah"]===null) ? "null" : $arr["blah"];

$arr["blah"] = "somevalue";
echo "<br>";
echo ($arr["blah"]===null) ? "null" : $arr["blah"];
var_dump ($arr);

4
你应该研究一下函数isset()is_null()empty()。欢迎来到松散类型、隐式转换几乎无所不在的地狱。 - Sammitch
2
@Fred-ii-,那些条件检查只是为了调试时打印出正在发生的事情。问题在于为什么可以给一个空变量的索引赋值。这似乎是个坏主意。$arr=null; $arr["index"] = "value"; - susie derkins
@susiederkins:这是因为PHP中数组的工作方式。请参阅此链接:http://us1.php.net/manual/en/language.types.array.php#language.types.array.syntax.modifying 如果 $arr 不存在,它将被创建,因此这也是创建数组的另一种替代方法。所以,当你执行 $arr = null;时,对于PHP来说,它与根本没有定义 $arr 是一样的(也许我不是100%确定:https://eval.in/68610),因此当你执行 $arr["blah"] = "somevalue"; 时,它会为你创建一个数组。 - gen_Eric
@susiederkins:这仍然无法解释为什么第一次没有出现“未定义的索引”。 - gen_Eric
4
可能是重复的问题:为什么当我像这样将 null 值作为数组处理时,PHP 没有报错?(原文链接:https://dev59.com/q2gu5IYBdhLWcg3w6bGo) - Chris Baker
显示剩余9条评论
2个回答

2

如果数组为null,PHP不会尝试进行比较。

在第二种情况下,由于数组被设置了,因此会进行比较。PHP不会检查它是否为空。

你的三元运算符试图访问变量$ arr [“blah”],而不是在进行比较之前检查它是否已设置。

编写正确的方法应该是:

error_reporting(E_ALL);
$arr = array();

if(isset($arr["blah"])) echo ($arr["blah"]===null) ? "null" : $arr["blah"];

$arr["blah"] = "somevalue";
echo "<br>";
if(isset($arr["blah"])) echo ($arr["blah"]===null) ? "null" : $arr["blah"];
var_dump ($arr);

1

实际上,John Vargo是正确的。如果一个变量为null,像访问数组一样访问它将只返回null而不会产生警告。这将在即将发布的7.4版本中更改,然后会产生一个警告。

Notice: Trying to access array offset on value of type null

实际输出仍然相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接