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