【问题标题】:PHP Storing object reference in an arrayPHP将对象引用存储在数组中
【发布时间】:2014-04-21 08:32:23
【问题描述】:

我在 PHP 中的引用遇到了一些问题。假设您执行以下操作:

<?php

class foo
{
    public $str;
}

class bar
{
    public $txt;
}

class x
{
    private $objs = array();

    public function add(&$obj)
    {
        $this->objs[] = $obj;
    }

    public function update()
    {
        foreach($this->objs as $obj)
        {
            $obj = new bar();
            $obj->txt = "bar";
        }
     }
}

//Make x
$x = new x();

//Make foo
$foo = new foo();
$foo->str = "foo";

//Add
$x->add($foo);

//update
$x->update();

var_dump($foo);

最后的var_dump 给出:

class foo#2 (1) {
  public $str =>
  string(3) "foo"
}

显然,我没有将我的引用正确地存储在数组中。有没有办法让$foo$x-&gt;update() 之后成为bar 类型?

【问题讨论】:

  • 有趣。我不认为你能做到这一点。对象已经是引用。基本上你需要一个参考参考。
  • @Ivarpoiss:“对象已经是引用。”那没有意义。对象就是对象。对象引用是指向对象的指针。 “对象”不是 PHP5 中的值。对象指针(引用)是。对象指针与任何其他值一样是值,包含它们的变量可以根据需要通过引用传递或分配。

标签: php arrays object pass-by-reference


【解决方案1】:

试试这个。我不知道这是为什么或如何工作的。只是在整个地方添加了一些'&'。

public function add(&$obj)
{
    $this->objs[] = &$obj;
}

public function update()
{
    foreach($this->objs as &$obj)
    {
        $obj = new bar();
        $obj->txt = "bar";
    }
}

更新

一个对象实际上只是逻辑上(对我们来说)一个引用,但在技术上与 php.ini 中的引用不同。

PHP manual 解释了这一点。对象变量不同于引用。引用是变量的别名。它指向该变量保存的相同数据。 Object 是一种保存对象标识符的数据类型。所以你也可以引用对象。

$a = new foo();
$b = $a;

$a 和 $b 这里是 2 个不同的变量,它们都具有相同的值(对象 id),而不是别名或引用类型。 这就像$a = 1;$b = $a; 一样工作。

数组可以存储引用。 通过var_dump($x-&gt;objs); 可以看到数组中的对象引用。

您不会经常在 var_dump 输出中看到对象的引用,因为引用会不断地被赋值取消引用。您也不能对 var_dump 和 array_push 等函数进行调用时传递引用。

您的问题是由取消引用和缺少其他引用运算符引起的。

【讨论】:

  • 确实如此,我还设法通过中间函数获得了类似的东西,但这很干净。任何人都可以在这里讨论一些理论,因为 PHP 声称不支持对引用的引用?
猜你喜欢
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2016-05-21
  • 2017-02-23
相关资源
最近更新 更多