迭代器(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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM