迭代器

迭代器设计模式是指使用迭代器遍历容器。在 PHP 中,如果一个类最终继承了 Traversable 接口,那么该类就可以使用 foreach 结构进行遍历。不幸的是,这是一个抽象的基础接口,你不能单独实现它(除非你在 PHP 核心中编写)。相反,你必须实现名为 IteratorIteratorAggregate 的接口。通过实现这两个接口中的任何一个,都可以使用 foreach 使一个类可迭代和遍历。

IteratorIteratorAggregate 接口非常相似,但 IteratorAggregate 接口会创建一个外部迭代器。作为一个接口,IteratorAggregate 只需要一个方法,即 getIterator。该方法必须返回 ArrayIterator 接口的实例。

迭代器聚合

假设我们想创建一个该接口的实现,它将遍历不同的时间。

首先,让我们从 IternatorAggregate 类的基本实现开始,了解它是如何工作的:

Unresolved include directive in modules/ROOT/pages/ch05/ch5-03.adoc - include::example$Chapter 5/Iterator/time.php[]

我们可以按如下方式迭代这个类:

<?php

class timeIterator implements IteratorAggregate {
    public function getIterator()
    {
        return new ArrayIterator(array(
            'property1' => 1,
            'property2' => 2,
            'property4' => 3
        ));
    }
}

其输出如下:

image 2023 10 31 09 11 30 062

我修改了这个脚本,使它能获取一个 time 值,然后计算两边的各种值,并使它们可以迭代:

Unresolved include directive in modules/ROOT/pages/ch05/ch5-03.adoc - include::example$Chapter 5/Iterator/time.php[]

该脚本的输出结果如下:

image 2023 10 31 09 13 54 605

迭代器

假设我们想要创建这个接口的实现,它将迭代不同的时间。

PHP 的众多迭代器

在此之前,我们已经探讨过 SPL(标准 PHP 库)中的一些函数,SPL 是接口和类的集合,其存在是为了解决常见问题。鉴于这一目的,它们与设计模式有着共同的目标,但它们都旨在以不同的方式解决这些问题。在 PHP 7 中构建和编译该扩展不需要任何外部库;事实上,你甚至无法禁用它。

作为该库的一部分,SPL 中有许多迭代器。您可以在 http://php.net/manual/en/spl.iterators.php 的文档中找到它们的列表。

下面是其中一些迭代器的列表,让您了解它们的用途:

  • AppendIterator

  • ArrayIterator

  • CachingIterator

  • CallbackFilterIterator

  • DirectoryIterator

  • EmptyIterator

  • FilesystemIterator

  • FilterIterator

  • GlobIterator

  • InfiniteIterator

  • IteratorIterator

  • LimitIterator

  • MultipleIterator

  • NoRewindIterator

  • ParentIterator

  • RecursiveArrayIterator

  • RecursiveCachingIterator

  • RecursiveCallbackFilterIterator

  • RecursiveDirectoryIterator

  • RecursiveFilterIterator

  • RecursiveIteratorIterator

  • RecursiveRegexIterator

  • RecursiveTreeIterator

  • RegexIterator