zoukankan      html  css  js  c++  java
  • 看看PHP迭代器的内部执行过程

    下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理。先来看一个官方的例子:

    class myIterator implements Iterator {
        private $position = 0;
        private $array = array(
            "first_element",
            "second_element",
            "last_element",
        );  
    
        public function __construct() {
            $this->position = 0;
        }
    
        function rewind() {
            var_dump(__METHOD__);
            $this->position = 0;
        }
    
        function current() {
            var_dump(__METHOD__);
            return $this->array[$this->position];
        }
    
        function key() {
            var_dump(__METHOD__);
            return $this->position;
        }
    
        function next() {
            var_dump(__METHOD__);
            ++$this->position;
        }
    
        function valid() {
            var_dump(__METHOD__);
            return isset($this->array[$this->position]);
        }
    }
    
    $it = new myIterator;
    
    foreach($it as $key => $value) {
    	echo '输出键值:';
        var_dump($key, $value);
    	//echo $key;
        echo "
    ";
    }
    

    程序运行输出:

    string(18) "myIterator::rewind"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(0)
    string(13) "first_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(1)
    string(14) "second_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(2)
    string(12) "last_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"
    

    一般的迭代器内部需要下面的方法:

    • Iterator::current — Return the current element 返回当前元素
    • Iterator::key — Return the key of the current element 返回当前元素的键
    • Iterator::next — Move forward to next element 移向下一个元素
    • Iterator::rewind — Rewind the Iterator to the first element 重新回到第一个元素
    • Iterator::valid — Checks if current position is valid 检查当前位置的有效性

    如果不是很清楚迭代器的内容工作流程,可以查看下面的迭代器对数组的遍历过程:

    /**
    * @author 简明现代魔法 http://www.nowamagic.net
    */
    class MyIterator implements Iterator
    {
         private $var = array();
    
         public function __construct($array)
         {
             if (is_array($array)) {
                $this->var = $array;
             }
         }
    
         public function rewind() {
             echo "倒回第一个元素
    ";
            reset($this->var);
         }
    
         public function current() {
            $var = current($this->var);
             echo "当前元素: $var
    ";
             return $var;
         }
    
         public function key() {
            $var = key($this->var);
             echo "当前元素的键: $var
    ";
             return $var;
         }
    
         public function next() {
            $var = next($this->var);
             echo "移向下一个元素: $var
    ";
             return $var;
         }
    
         public function valid() {
            $var = $this->current() !== false;
             echo "检查有效性: {$var}
    ";
             return $var;
         }
    }
    
    $values = array(1,2,3);
    $it = new MyIterator($values);
    
    foreach ($it as $k => $v) {
         print "此时键值对 -- key $k: value $v
    
    ";
    }
    

    程序运行结果:

    倒回第一个元素
    当前元素: 1
    检查有效性: 1
    当前元素: 1
    当前元素的键: 0
    此时键值对 -- key 0: value 1
    
    移向下一个元素: 2
    当前元素: 2
    检查有效性: 1
    当前元素: 2
    当前元素的键: 1
    此时键值对 -- key 1: value 2
    
    移向下一个元素: 3
    当前元素: 3
    检查有效性: 1
    当前元素: 3
    当前元素的键: 2
    此时键值对 -- key 2: value 3
    
    移向下一个元素: 
    当前元素: 
    检查有效性: 
    

    现在就很清晰了吧?

  • 相关阅读:
    Flink资料(5) -- Job和调度
    Flink资料(4) -- 类型抽取和序列化
    Flink资料(3)-- Flink一般架构和处理模型
    Flink资料(2)-- 数据流容错机制
    Flink资料(1)-- Flink基础概念(Basic Concept)
    联系InfoSphere Streams和OpenMI时对水利模型联系的设计模式的一些考虑
    [Azure][CLI][02]Basic OPS
    [Azure][PowerShell][ARM][01]Connect
    [Azure][PowerShell][ASM][13]Reset Password
    [Azure][PowerShell][ASM][12]ACL
  • 原文地址:https://www.cnblogs.com/fyy-888/p/5102584.html
Copyright © 2011-2022 走看看