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