为什么PHP有迭代器对象?

为什么PHP有迭代器对象?,php,iterator,Php,Iterator,今天我无意中发现了这一页,我想知道为什么需要这些课程。我想假设它们是有用途的,否则它们就不会在PHP中。当已经有非常简单的方法做这些事情时,我很难看到这些项目的好处 PHP成为一种更受尊敬的/面向对象的编程语言是否犯了错误?或者这样做真的有好处吗 一个很好的例子说明了有两种方法可以做到这一点: 您的示例并不是使用迭代器对象的真正原因。在大多数情况下,迭代器对象用于对类进行迭代,并将类直接用作迭代器 下面是一个简短的例子 当您使用单个数组时,在该数组上创建foreach非常容易。您的示例并不是使

今天我无意中发现了这一页,我想知道为什么需要这些课程。我想假设它们是有用途的,否则它们就不会在PHP中。当已经有非常简单的方法做这些事情时,我很难看到这些项目的好处

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

一个很好的例子说明了有两种方法可以做到这一点:


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

下面是一个简短的例子


当您使用单个数组时,在该数组上创建foreach非常容易。

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

下面是一个简短的例子


当您使用单个数组时,在数组上创建foreach非常容易。

对于我的示例,我不会将答案限制为迭代器,而是包括可遍历的

看看SimpleXML(和)


非常有用且易于使用,并允许您将XML转换为可以迭代/遍历的对象,因为它扩展了提供该功能的类。我已经探索了一条相当多的XML之路,我很高兴它不必重新发明轮子来提供这一点。我确信还有更多的例子说明了它们的用途和存在的原因,但这是第一个我立即从中受益的非数组的例子。

对于我的例子,我不会将答案限制在迭代器上,而是包括可遍历的

看看SimpleXML(和)


非常有用且易于使用,并允许您将XML转换为可以迭代/遍历的对象,因为它扩展了提供该功能的类。我已经探索了一条相当多的XML之路,我很高兴它不必重新发明轮子来提供这一点。我确信还有更多的例子说明了它们的用途和存在的原因,但这是第一个我立即从中受益的非数组的例子。

您可能会遇到一个实例,您希望在该实例中实现到类中,这样您就可以对私有成员进行迭代,而无需将其公开,或创建公共功能:

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>";
}
$barball=新棒球队();
foreach($n=>t)
{
回声“Team#$n:$t

”; }
您可能会遇到一个实例,您希望在该实例中实现类中的,因此您可以对私有成员进行迭代,而无需将其公开,或者创建一个公共函数:

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>";
}
$barball=新棒球队();
foreach($n=>t)
{
回声“Team#$n:$t

”; }
迭代器包含在PHP中,因为它允许您对任意对象使用公共语言构造(如foreach),而不是局限于在内置对象(如数组)上循环。强制对象将其内部状态转换为数组供您迭代是一件麻烦事(并且破坏了封装),对于大型数据集,可能会导致系统内存不足。iterable通过让对象本身仅在被请求时返回单个元素来克服这两个问题。

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

为什么它们不存在?数组(在PHPs意义上)非常有限。看看现有的迭代器。具体的描述了一些常见的用例(例如递归用例)。中的解释可能会有所帮助,尽管这是关于Java的,但为什么它们不应该存在?数组(在PHPs意义上)非常有限。看看现有的迭代器。具体的描述了一些常见的用例(例如递归用例)。中的解释可能会有所帮助,尽管这是关于java的