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->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->objs);
可以看到数组中的对象引用。
您不会经常在 var_dump 输出中看到对象的引用,因为引用会不断地被赋值取消引用。您也不能对 var_dump 和 array_push 等函数进行调用时传递引用。
您的问题是由取消引用和缺少其他引用运算符引起的。
【讨论】:
确实如此,我还设法通过中间函数获得了类似的东西,但这很干净。任何人都可以在这里讨论一些理论,因为 PHP 声称不支持对引用的引用?以上是关于PHP将对象引用存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章