1

我今天偶然发现了这个PHP: Iterators页面,我想知道为什么甚至需要这些类。我想假设它们是有目的的,否则它们就不会出现在 PHP 中。当已经有非常简单的方法可以做到这些时,我很难看到这些项目的好处。

PHP 在成为一种更受人尊敬/面向对象的编程语言方面是否犯了错误?或者这样做真的有好处吗?

在 ArrayIterator 上的 PHP 评论中找到了一个很好的例子,说明了如何有 2 种方法:

<?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

4 回答 4

5

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

于 2012-06-20T12:57:05.507 回答
1

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

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

这是一个简短的例子。

当你有一个数组时,在数组上创建一个 foreach 真的很容易。

于 2012-06-20T12:44:11.573 回答
1

对于我的示例,我不会将答案限制为 Iterator,还包括 Traversable。

看看 SimpleXML(SimpleXMLElementSimpleXMLIterator)。

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

于 2012-06-20T12:52:19.887 回答
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 );
    }
}

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

$baseball = new BaseballTeams( );

foreach ( $baseball as $n => $t )
{
    echo "<p>Team #$n: $t</p>";
}
于 2012-06-20T12:53:36.833 回答