索引null变量时未引发php未定义索引通知

索引null变量时未引发php未定义索引通知,php,arrays,undefined,Php,Arrays,Undefined,我很想知道PHP中的以下行为是否是有意的。而且,如果有意的话,可以通过在数组中创建索引来从空变量初始化数组(如第一个代码段中所做的那样) 但是,如果首先初始化数组(请参见下面的代码),我会得到完全相同的输出,但是当我第一次尝试$arr[“blah”] 错误报告(E_ALL); $arr=array(); echo($arr[“blah”]==null)?“null”:$arr[“blah”]; $arr[“blah”]=“somevalue”; 回声“”; echo($arr[“blah”]==

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

但是,如果首先初始化数组(请参见下面的代码),我会得到完全相同的输出,但是当我第一次尝试
$arr[“blah”]

错误报告(E_ALL);
$arr=array();
echo($arr[“blah”]==null)?“null”:$arr[“blah”];
$arr[“blah”]=“somevalue”;
回声“
”; echo($arr[“blah”]==null)?“null”:$arr[“blah”]; var_转储($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);
错误报告(E_ALL);
$arr=array();
如果(isset($arr[“blah”])回波($arr[“blah”]==null)?“null”:$arr[“blah”];
$arr[“blah”]=“somevalue”;
回声“
”; 如果(isset($arr[“blah”])回波($arr[“blah”]==null)?“null”:$arr[“blah”]; var_转储($arr);
事实上,约翰·瓦戈是正确的。如果一个变量是
null
,那么像访问数组一样访问它只会返回
null
,而不会发出通知。这将在即将发布的7.4版本中进行更改,然后将生成一个通知

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

实际输出仍然是一样的。

这是有意的,但极不可取。它是过去的遗物,不是应该在好代码中使用的任何东西。始终在使用前初始化变量。您应该查看函数
isset()
为空()
,以及
为空()
。欢迎来到松散类型、隐式几乎所有东西的地狱。我可能不完全理解这个问题,但是当“赋值”时,人们会使用
=
操作符,而不是将检查作为
=
==
的条件语句,我是否遗漏了什么?在我看来,你不能把一个条件传递成一个
echo
@Fred ii-那些条件检查只是为了我调试打印出发生了什么。问题是为什么可以将值赋给空变量的索引。这似乎是个坏主意<代码>$arr=null$arr[“索引”]=“值”可能重复的
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);
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);
Notice: Trying to access array offset on value of type null