迭代器(Iterator)的使用

迭代器(Iterator)的使用

我这里主要讲一下聚合式迭代器(IteratorAggregate)

因为聚合式迭代器和ArrayIterator配合使用可以直接跳过Iterator需要实现的5个方法,实现同样的功能。

1、什么是迭代器?
我的个人理解就是“一个一个数过去”的意思。

2、迭代器的特点:
(1)ArrayIterator允许从PHP数组中创建一个迭代器,ArrayIterator可以直接跳过Iterator需要实现的5个方法,实现同样的功能
(2)当ArrayIterator和IteratorAggregate一起工作的时候,直接免去Iterator创建方法的工作,只需要在实现IteratorAggregate的getIterator()方法的时候,返回一个ArrayIterator接口就好。
(3)IteratorAggregate的c语言实现代码,定义了抽象方法getIterator(),所以实现接口的时候,必须定义该方法。
(4)因为迭代器都实现了遍历接口(Traversable),所以当我们的HeaderCollection类实现了IteratorAggregate类之后,就可以直接使用foreach()遍历$this->_header中的每一个元素了。

3、下面用一个设置http报头的例子来说明迭代器的使用场景。

<?php

/**
 * @purpose: 设置获取当前请求的http报头。
 * Class HeaderCollection
 * @package core\web
 */
class HeaderCollection implements \IteratorAggregate
{
    private $_headers = [];

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

    /**
     * @purpose: 获取名称为$name的http报头
     * @param string $name 报头名
     * @param string $default 当所获取的http报头不存的时候,返回的默认值
     * @param bool $first 是否仅仅只返回该报头的第一个值,返回值为一个字符串。如果为flase,将会返回所有,其返回值为一个数组
     * @return mixed|string
     */
    public function get($name, $default = null, $first = true)
    {
        $name = strtolower($name);
        if(isset($this->_headers[$name])){
            return $first ? reset($this->_headers[$name]) : $this->_headers[$name];
        }
        return $default;
    }

    /**
     * @purpose: 设置一个新的http报头
     * @param string $name header名称
     * @param string $value header的值,
     * @return $this
     */
    public function set($name, $value = '')
    {
        $name = strtolower($name);
        $this->_headers[$name] = (array) $value;
        return $this;
    }

    /**
     * @purpose: 设置一个默认的http报头,只有在该http报头不存在的情况下才能设置成功。
     * 如果已经有同名的http报头,则新设置的报头将会被忽略掉。
     * @param string $name header名称
     * @param string $value header的值
     * @return $this
     */
    public function setDefault($name, $value)
    {
        $name = strtolower($name);
        if(empty($this->_headers[$name])){
            $this->_headers[$name][] = $value;
        }
        return $this;
    }
}

使用的时候只需要 new 一个 HeaderCollection 对象,然后使用foreach就可以遍历出所有的header了,代码如下:

$headers = new HeaderCollection();
foreach($headers as $name => $values) {
    //所有的http报头的名称都是首字母大写,且多个单词以 - 分隔
    $name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
    $replace = true;
    foreach($values as $value) {
        header("$name: $value", $replace);
        $replace = false; //强制使相同的头信息并存
    }
}

本文为chrdai工作中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/10871254.html

 

posted @ 2019-05-15 18:20  Chrdai  阅读(2443)  评论(0编辑  收藏  举报