【问题标题】:PHP "Assign by reference" oddityPHP“通过引用分配”奇怪
【发布时间】:2016-07-12 22:15:19
【问题描述】:

我遇到了一个包含$a = & $b; 的代码 sn-p,但没有测试 $b 是否真的存在 (if (isset($b)))。我不确定 PHP 是如何处理这个问题的,所以我进行了一个快速的裸测试,现在我更加感兴趣了。

$a = array('a'=>'b', 'x'=>'y');

$b = array();

$b[10] = &$a['a'];
$b[11] = &$a['ppp'];

var_dump($a);
var_dump($b);
echo (isset($a['ppp']) ? "SET" :" NOT SET") . "\n";
echo (isset($b[11]) ? "SET" :" NOT SET") . "\n";

这是裸代码,但输出显示的是:

  • $b[11] = &$a['ppp'] 的简单分配就足够了,var_dump($a) 报告为有 3 个成员而不是 2 个,即使没有为 $a['ppp'] 分配。 $a['ppp'] 被报告为具有值 (NULL),但也具有 isset()=FALSE

  • 与此同时,$b[11] 显示一个值 NULLisset()=FALSE,即使它的引用对象(显然)确实存在(!)

    李>

我很欣赏首先检查可以解决“问题”,但我主要是在寻求更深入的了解。发生了什么事?

【问题讨论】:

  • 值为set,当它是NOT NULL
  • 如果您对这种情况如此感兴趣,为什么不参与讨论?

标签: php reference variable-assignment


【解决方案1】:

解释就这么简单

如果您通过引用分配、传递或返回未定义的变量,它将被创建

(强调我的)

这就是你正在做的;通过引用分配未定义的索引,以便创建它。

示例 #1 使用未定义变量的引用

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?> 

Example from PHP Manual

那你还有一个问题:

与此同时,$b[11] 显示一个值 NULL 和 isset()=FALSE,即使它的引用对象(显然)确实存在 (!)

这在说明书上也解释得很清楚

isset — 确定变量是否已设置并且不为 NULL

如果测试已设置为 NULL 的变量,isset() 将返回 FALSE

由于是NULLisset() 返回 FALSE。

【讨论】:

    【解决方案2】:

    slot 必须存在才能让您能够为其别名另一个变量(这确实是这里发生的事情,PHP 的“引用”并不像每个“通过引用”操作是一个常规操作,其中复制替换为别名),但它不必包含非空值,并且在您为其分配一个值(通过其名称中的一个)之前不会包含。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2017-10-24
      相关资源
      最近更新 更多