【问题标题】:php undefined index notice not raised when indexing null variable索引空变量时未引发php未定义索引通知
【发布时间】:2013-11-15 19:29:15
【问题描述】:

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

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

【问题讨论】:

  • 这是有意的,但强烈不推荐。这是过去的遗物,而不是应该在好的代码中使用的任何东西。始终在使用前初始化变量。
  • 您应该查看函数isset()is_null()empty()。欢迎来到松散类型、隐含的几乎所有地狱。
  • 我可能没有完全理解这个问题,但是在“分配”时,人们会使用= 运算符而不是检查===== 的条件语句我错过了什么这里? IMO,您不能将条件传递为echo
  • @Fred-ii- 这些条件检查仅供我调试以打印出正在发生的事情。问题是为什么可以为空变量的索引赋值。似乎是个坏主意。 $arr=null; $arr["index"] = "value";

标签: php arrays undefined


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    实际输出还是一样的。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2012-09-26
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多