【问题标题】:Duplicating an Object, Changing a Variable [duplicate]复制对象,更改变量[重复]
【发布时间】:2021-05-15 08:26:29
【问题描述】:

我有以下代码:

foreach($this->items as $item) {
            
    echobr("a item price: " . $item->price);
    $duplicate = $item;
    $duplicate->price = 0;
    $duplicate->type = "Discount Item";

    echobr("b item price: " . $item->price);
    echobr("c dup item price: " . $duplicate->price);
        // Duplicate new item to cart
        $this->AddItem($duplicate);
}

我得到的输出是:

a item price: 10
b item price: 0
c dup item price: 0

因此,出于某种原因,更改临时变量 $duplicate 的价格会更改 $this-items 的价格,但我不知道为什么?我想这样做你需要使用引用变量,例如&$items

【问题讨论】:

  • 您需要克隆对象。这就是它在许多语言中的工作方式,而不仅仅是 PHP。
  • @ÁlvaroGonzález 如何克隆?为什么我不能像普通变量一样复制?所以我是对的,重复只是一个指针或引用变量吗?
  • 因为“operator="创建引用,也就是说$duplicate只是$item的别名
  • @Berto99 但为什么对象会这样,而不是变量?

标签: php object


【解决方案1】:

对象是copied by reference。所以$duplicate 指向内存中的$item。改变一个,你改变他们两个。

要获取新对象,您必须clone原始对象。

$duplicate = clone $item;

【讨论】:

  • 哇,在我这么多年的编码生涯中,我从未见过这种情况!非常感谢!
  • 我在上面问过,但是为什么= 是通过引用复制对象而不是变量?
  • 好问题。 PHP 真的只是在这里跟随其他语言的领先地位。我猜这与更好的内存使用有关,因为对象在内存中可能比典型的标量变量更大。
  • 哇,谢谢。我没有用 PHP 进行大量的 OOP 编程,所以这对我来说是新的。学习新东西真是太好了。
猜你喜欢
  • 2013-11-25
  • 2013-11-26
  • 2020-02-18
  • 2012-10-17
  • 2015-06-16
  • 2012-09-21
  • 2011-08-29
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多