gpt4 book ai didi

PHP 在数组中存储对象引用

转载 作者:行者123 更新时间:2023-12-02 01:51:26 25 4
gpt4 key购买 nike

我在使用 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 类型?

最佳答案

试试这个。我不知道为什么或如何工作。只是在各处添加了一些“&”。

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

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

更新

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

PHP manual解释这个。对象变量不同于引用。引用是变量的别名。它指向该变量保存的相同数据。对象是一种保存对象标识符的数据类型。因此,您还可以引用对象。

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

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

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

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

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

关于PHP 在数组中存储对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com