【问题标题】:Items in Arrays, are they references?数组中的项目,它们是引用吗?
【发布时间】:2011-03-22 00:44:49
【问题描述】:

看下面的代码:

$index = GetIndexForId($itemid);

$item = null;

if( $index == -1 )
{
    $item = array();
    $this->items[] = $item;
    $index = count($this->items)-1;
}
else
    $item = $this->items[$index];

$item['id'] = $itemid;
$item['qty'] = $qty;
$item['options'] = $options;

$this->items[$index] = $item; // This line is my question

最后一行,有必要吗?我真的不知道php如何处理数组赋值。

附: GetIndexForId 只是搜索当前 ID 是否已经存在于数组中,而其他“未声明”的变量是参数。

【问题讨论】:

  • 我喜欢从 3.5 年前发布的问题中得到 -1。不管你是谁,请留下评论为什么?!?!?!

标签: php pass-by-reference


【解决方案1】:

来自documentation:

数组赋值总是涉及值复制。使用引用运算符通过引用复制数组。

所以是的,鉴于您的代码,最后一行是必要的,但 $this->items[] = $item; 是多余的。

【讨论】:

  • 你能按索引添加一个项目并正确更新数组的“键”吗?
  • @TJMonk15:我不太明白你想要什么。
【解决方案2】:

如果你想更新你的对象,是的,你需要最后一行

【讨论】:

  • $index = count($this->items)-1;处理你提出的问题,但是 ty
  • 你是什么意思?如果你想用你对$item所做的更改来更新$this->items[$index],那么你需要最后一行来更新$this->items[$index]
  • 好吧,我就是这么想的,但是你说 [你删除的东西] 我不记得具体是什么了。
  • 是的,我试图解释我在上一条评论中所说的话,但不清楚:D
【解决方案3】:

任何值类型,如 boolean、int... 都不会通过引用传递。但是,如果您的数组中充满了对象,它将通过引用传递。在您的示例中,您需要最后一行。但正如我所说,如果 $item 是一个对象,你就不需要最后一行。可以使用引用运算符通过引用传递值类型。

了解如何使用引用运算符 HERE

【讨论】:

  • 数组在 php 中算作“对象”吗? (我习惯于 C#)并且每个“项目”都被定义为一个数组......
  • 没有。与大多数 OOP 语言中一切都是对象不同,在 PHP 中,只有显式对象才被视为“对象”。
  • 不,不同类型的东西在数组中的存储方式没有区别。一切都是按值存储的,除非您明确指定&,在这种情况下它将通过引用来存储。 “对象”不是 PHP 5 中的值。您拥有的是对象引用。如果没有&,则按值存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2011-01-04
  • 2021-02-26
  • 2020-02-15
  • 1970-01-01
  • 2017-04-07
  • 2014-03-04
相关资源
最近更新 更多