看看PHP迭代器的内部执行过程

实现一个自定义的迭代器
服务器君一共花费了201.996 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

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

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 "\n";
}

程序运行输出:

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 "倒回第一个元素\n";
        reset($this->var);
     }

     public function current() {
        $var = current($this->var);
         echo "当前元素: $var\n";
         return $var;
     }

     public function key() {
        $var = key($this->var);
         echo "当前元素的键: $var\n";
         return $var;
     }

     public function next() {
        $var = next($this->var);
         echo "移向下一个元素: $var\n";
         return $var;
     }

     public function valid() {
        $var = $this->current() !== false;
         echo "检查有效性: {$var}\n";
         return $var;
     }
}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $k => $v) {
     print "此时键值对 -- key $k: value $v\n\n";
}

程序运行结果:

倒回第一个元素
当前元素: 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

移向下一个元素: 
当前元素: 
检查有效性: 

现在就很清晰了吧?

延伸阅读

此文章所在专题列表如下:

  1. 看看PHP迭代器的内部执行过程
  2. 用PHP迭代器来实现一个斐波纳契数列
  3. PHP SPL,被遗落的宝石
  4. PHP数据结构预热:PHP的迭代器
  5. PHP Predefined Interfaces 预定义接口

本文地址:http://www.nowamagic.net/librarys/veda/detail/2163,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2163

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《C陷阱与缺陷》 Andrew Koenig (作者), 高巍 (译者)

《C和C++经典著作•C陷阱与缺陷》适合有一定经验的C程序员阅读学习,即便你是C编程高手,《C和C++经典著作•C陷阱与缺陷》也应该成为你的案头必备书籍。作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作《C和C++经典著作•C陷阱与缺陷》的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。《C和C++经典著作•C陷阱与缺陷》分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议。

更多计算机宝库...