尝试理解php中的迭代器接口


try to understand The Iterator interface in php

我正在阅读http://php.net/manual/en/class.iterator.php,但是很难理解示例#1的基本用法。问题:

  1. var_dump(__METHOD__);

    我知道你可以在这里使用变量,例如:var_dump($count),但方法不是变量,或者它是全局变量/常量?

  2. foreach($it as $key => $value) {
        var_dump($key, $value);
        echo "'n";
    }
    

    如果我把它改成:

    foreach($it as $key => $value) {
    }
    

    如果我运行脚本,它仍然可以显示结果,为什么?

  3. var_dump($key, $value);

    结果是

    int 0 string 'firstelement' (length=12)

    int 1 string 'secondelement'(长度=13)…

    为什么是这个结果?foreach($it as $key => $value), $it是对象,它不是$数组,所以这是怎么发生的?

Iterator接口允许类在foreach语句中表现得像一个数组。

因为它不是数组,类必须知道在这种情况下如何表现。这是通过调用(通过foreach,为了简单起见)一些从Iterator接口实现的方法来完成的。因为这是接口需求,所以应该实现所有的方法,即使您不打算使用其中的一些方法,比如检索键。

在方法中,你可以输入任何你喜欢的东西,甚至是在foreach循环中没有意义的东西(比如你不增加计数器$position)。

在手册中,var_dump()用于显示调用哪些方法。__METHOD__伪常量是一个返回当前方法名称的字符串。您应该删除这些行,因为它们仅用于示例目的。

Iterator接口中的每个方法都是公共的,因此您可以在代码中的任何位置调用它们,但不需要在程序中调用它们。在foreach循环中,它们是自动调用的,所以这就是空循环工作的原因。