PHP 未定义的索引通知在索引空变量时不引发


php undefined index notice not raised when indexing null variable

我很想知道PHP中的以下行为是否有意。 而且,如果是有意的,通过在其中创建索引来从空变量初始化数组被认为是可以接受的(就像在第一个代码片段中所做的那样)?

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);

如果数组为空,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);

事实上,约翰·瓦戈是正确的。如果一个变量是null的,像访问数组一样访问它只会返回null而不通知。这将在即将推出的 7.4 版本中发生变化,然后会产生通知。

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

实际输出仍然相同。