【问题标题】:Issue with modifying array by reference通过引用修改数组的问题
【发布时间】:2013-10-21 14:13:15
【问题描述】:

在 PHP 中,我有以下代码(精简,以便于阅读):

class Var {
  public $arr;
  function __construct($arr) {
    $this->arr = $arr;
  }
  function set($k, $v) {
    $this->arr[$k] = $v;
  }
}

class Session extends Var {
  function __construct() {}
  function init() {
    session_start();
    parent::__construct($_SESSION);
  }
}

$s = new Session();
$s->init();
$s->set('foo', 'bar');

var_dump($_SESSION);

此时,我希望 $_SESSION 包含 'foo' => 'bar'。但是,$_SESSION 变量是完全空的。为什么会这样?如何将 $_SESSION 变量存储为属性,以便以后通过引用对其进行修改?

我尝试将__construct($arr) 替换为__construct(&$arr),但没有成功。

【问题讨论】:

  • “但这不起作用。” --- 它确实有效。但这还不足以按您的预期工作。
  • 是不是因为您没有将您的$arr 声明为array()?所以在你的classVar构造函数中,$this->arr = $array();

标签: php session reference pass-by-reference


【解决方案1】:

您需要注意对每个变量重新分配的引用。

所以第一名是__construct(&$arr)

第二个是$this->arr = &$arr;

那么它应该可以工作了。

如果您没有将 & 放在后一种情况下 - 它会为您在构造函数中传递的引用“制作副本”并将“副本”分配给 $this->arr。

PS:从非构造方法调用父构造方法真的很奇怪

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2021-10-14
    • 2016-04-02
    • 2010-09-23
    • 1970-01-01
    • 2015-05-19
    • 2015-04-04
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多