gpt4 book ai didi

php - 一个对象应该实现迭代器还是包含另一个实现迭代器的对象

转载 作者:可可西里 更新时间:2023-11-01 13:59:16 26 4
gpt4 key购买 nike

我正在努力了解 SPL 迭代器,我想出了 2 种方法来处理它。我认为第一个版本不那么复杂,但第二个版本具有组合感(我认为)。

我没有看到哪一个比另一个更可取?或者我只是把它复杂化了?

这是我的想法:

该对象实现了一个迭代器:

class BoxOfChocolates implements Iterator {

private $id
private $name; // e.g. Valentine's Heart Box
private $maker; // e.g. Hersheys
private $items; // array

public function getChocolates() {
$query = ...
foreach($rows as $row) {
$this->_items[] = new Chocolate() ...
}
}

// ... necessary iterator implementation stuff


}

该对象包含一个可迭代的对象:

class BoxOfChocolates {

private $id;
private $name;
private $maker;
private $items; // chocolates object

public function getChocolates() {
$this->items = new Chocolates();
$this->items->getChocolates();
}

}


class Chocolates implements Iterator {

private $items;

public function getChocolates() {
$query = ...
foreach($rows as $row) {
$this->_items[] = new Chocolate() ...
}
}

// ... necessary iterator implementation stuff

}

最佳答案

bbxbby,最好的解决方案通常是最简单的。您绝对不会使创建单独的迭代器对象的事情过于复杂。事实上,PHP 支持并鼓励这种聚合,提供 IteratorAggregate 接口(interface)。实现 IteratorAggregate 的对象必须包含返回 IteratorgetIterator() 方法。这确实是您的 getChocolated() 方法所做的。 IteratorAggregate 的好处是您可以将它的对象直接传递给 foreach 循环。您的代码在使用时可能看起来像这样:

class BoxOfChocolates implements IteratorAggregate

private $chocolates = array();

public function getIterator() {
return new ArrayIterator(new ArrayObject($this->chocolates)));
}

}

然后,在代码的某处:

$box = new BoxOfChocolates();
foreach ($box as $chocolate) { ... }

关于php - 一个对象应该实现迭代器还是包含另一个实现迭代器的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216094/

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