PHP将对象引用存储在数组中

Posted

技术标签:

【中文标题】PHP将对象引用存储在数组中【英文标题】:PHP Storing object reference in an array 【发布时间】: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 中的值。对象指针(引用)是。对象指针与任何其他值一样是值,包含它们的变量可以根据需要通过引用传递或分配。 【参考方案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 声称不支持对引用的引用?

以上是关于PHP将对象引用存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章

php传值和传引用的区别

Firebase 引用对象不会保存到 SwiftUI 中的变量

Java中数组对象的存储位置?

如何在 PHP 中克隆对象数组?

[PHP] 数据结构-线性表的顺序存储结构PHP实现

PHP:检查对象/数组是不是为引用