为什么PHP有迭代器对象?

时间:2012-06-20 12:39:23

标签: php iterator

今天我偶然发现了这个PHP: Iterators页面,我想知道为什么甚至需要这些课程。我想假设它们有用,否则它们不会用PHP。当我们已经采用非常简单的方法时,我很难看到这些物品的好处。

PHP是否会成为更受尊重/面向对象的编程语言?或者这样做真的有好处吗?

PHP comment on the ArrayIterator中有一个很好的例子,说明了如何实现这两种方法:

<?php
$fruits = array(
    "apple" => "yummy",
    "orange" => "ah ya, nice",
    "grape" => "wow, I love it!",
    "plum" => "nah, not me"
);
$obj = new ArrayObject( $fruits );
$it = $obj->getIterator();

// How many items are we iterating over?
echo "Iterating over: " . $obj->count() . " values\n";

// Iterate over the values in the ArrayObject:
while( $it->valid() ) {
    echo $it->key() . "=" . $it->current() . "\n";
    $it->next();
}

// The good thing here is that it can be iterated with foreach loop

foreach ($it as $key=>$val)
echo $key.":".$val."\n";

/* Outputs something like */

Iterating over: 4 values
apple=yummy
orange=ah ya, nice
grape=wow, I love it!
plum=nah, not me

?>

4 个答案:

答案 0 :(得分:5)

迭代器包含在PHP中,因为它允许您使用具有任意对象的公共语言结构(例如foreach),而不是仅限于循环内置对象(如数组)。强迫对象将其内部状态转换为数组以供您迭代,这是一个麻烦(并打破封装),对于大型数据集可能会使您的系统内存不足。迭代允许您通过让对象本身仅在请求时返回单个元素来解决这两个问题。

答案 1 :(得分:1)

您的示例并不是使用Iterator对象的原因。在大多数情况下,Iterator对象用于迭代类并使用直接类作为迭代器。

http://php.net/manual/de/class.iterator.php

这是一个简短的例子。

如果你有一个数组,那么就可以更容易地对数组进行预测。

答案 2 :(得分:1)

对于我的例子,我不会限制Iterator的答案,但也包括Traversable。

看看SimpleXML(SimpleXMLElementSimpleXMLIterator)。

非常有用且易于使用,并允许您将XML转换为可以迭代/遍历的对象,因为它扩展了提供该功能的类。我已经通过公平的XML分享了我的方式,我很高兴它不需要重新发明轮子来提供它。我相信它们的使用和存在的原因有更多的例子,但这些是第一个突然出现的,我立刻从中受益的不是数组。

答案 3 :(得分:0)

您可能会遇到希望将IteratorAggregate实现到类中的实例,因此您可以通过私有成员进行迭代,而不必将其公开,或者创建公共函数:

class BaseballTeams implements IteratorAggregate
{
    private $teams;

    public function __construct( )
    {
        $this->teams = explode( ',', "Tigers,Cubs,Orioles,Mariners,Yankees,Blue Jays,Marlins" );
    }

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

现在,您可以循环访问私有$ team成员,如下所示:

$baseball = new BaseballTeams( );

foreach ( $baseball as $n => $t )
{
    echo "<p>Team #$n: $t</p>";
}