• 迭代器(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 coreweb
     */
    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

     

  • 相关阅读:
    架设某大型网站服务器之全部过程
    利用js实现页面关闭时发送http请求
    用jquery解析JSON数据的方法
    在创业公司工作四年,如何赚百万
    一个http请求的详细过程
    VIM 查找替换命令的使用
    swfobject
    获取并显示某目录下的图片
    Windows下架设Subversion服务器
    OA系统概念(办公自动化系统)
  • 原文地址:https://www.cnblogs.com/chrdai/p/10871254.html
Copyright © 2020-2023  润新知