首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP中克隆ArrayIterator?

如何在PHP中克隆ArrayIterator?
EN

Stack Overflow用户
提问于 2015-12-26 03:27:03
回答 2查看 912关注 0票数 3

我正在尝试克隆\ArrayIterator对象,但似乎克隆的对象仍然引用原始对象。

代码语言:javascript
复制
$list = new \ArrayIterator;
$list->append('a');
$list->append('b');

$list2 = clone $list;
$list2->append('c');
$list2->append('d');

// below result prints '4', i am expecting result '2'
echo $list->count();

有人能解释一下这种行为吗?提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-26 04:16:44

虽然我很难找到明确这么说的文档,但内部ArrayIterator的私有$storage属性(其中持有数组)必须是对数组的引用,而不是直接存储在对象中的数组本身。

clone

PHP 5将执行对象所有属性的浅拷贝。任何引用其他变量的属性都将保持引用。

因此,当您clone ArrayIterator对象时,新克隆的对象包含对与原始数组相同的数组的引用。这是一个旧的bug报告,其中这种行为被认为是预期的行为。

如果要复制ArrayIterator的当前状态,可以考虑使用数组getArrayCopy()实例化一个新状态。

代码语言:javascript
复制
$iter = new \ArrayIterator([1,2,3,4,5]);

// Copy out the array to instantiate a new one
$copy = new \ArrayIterator($iter->getArrayCopy());
// Modify it
$copy->append(6);

var_dump($iter); // unmodified
php > var_dump($iter);
class ArrayIterator#1 (1) {
  private $storage =>
  array(5) {
    [0] =>
    int(1)
    [1] =>
    int(2)
    [2] =>
    int(3)
    [3] =>
    int(4)
    [4] =>
    int(5)
  }
}

var_dump($copy); // modified
class ArrayIterator#2 (1) {
  private $storage =>
  array(6) {
    [0] =>
    int(1)
    [1] =>
    int(2)
    [2] =>
    int(3)
    [3] =>
    int(4)
    [4] =>
    int(5)
    [5] =>
    int(6)
  }
}

不过,上面的操作很简单,只创建一个新的ArrayIterator,当前存储的数组作为原始数组。它不维护当前的迭代状态。要做到这一点,还需要调用seek()将指针提前到所需的位置。以下是一个详尽的答案,解释了如何做到这一点。

票数 6
EN

Stack Overflow用户

发布于 2017-07-18 16:54:03

完成前面提到的内容,如果要克隆继承自ArrayIterator的类,可以使用此方法来自动克隆存储的数组:

代码语言:javascript
复制
public function __clone(){
    parent::__construct($this->getArrayCopy());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34468244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档