在foreach循环中如何从Iterator接口调用方法,以及它们的返回值会如何?

时间:2019-01-26 18:11:03

标签: php oop interface iterator

我正在尝试了解PHP中的对象迭代。

方法current()的方式和时间; key()next()valid()被叫吗?他们的返回值用于任何东西吗?

我从PHP Manual看过以下代码示例:

<?php
class MyIterator implements Iterator
{
    private $var = array();

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        echo "rewinding\n";
        reset($this->var);
    }

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

    public function key() 
    {
        $var = key($this->var);
        echo "key: $var\n";
        return $var;
    }

    public function next() 
    {
        $var = next($this->var);
        echo "next: $var\n";
        return $var;
    }

    public function valid()
    {
        $key = key($this->var);
        $var = ($key !== NULL && $key !== FALSE);
        echo "valid: $var\n";
        return $var;
    }

}

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

foreach ($it as $a => $b) {
    print "$a: $b\n";
}

以上程序的输出为:

rewinding
valid: 1
current: 1
key: 0
0: 1
next: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
valid: 1
current: 3
key: 2
2: 3
next:
valid: 

我正在使用 PHP 7.3.1

1 个答案:

答案 0 :(得分:1)

这四个方法返回的值在foreach迭代过程中按如下方式使用:

  1. 在每次迭代开始时,将调用valid()。如果返回false,则循环退出。此值不会存储在任何地方,并且会丢失。

  2. 在每次迭代中,调用$a$b初始化循环变量(在您的示例中为current()key())。

    a。 $a = key()

    b。 $b = current()

  3. 循环的主体运行之后,将调用next()next()返回的任何内容都将被忽略。如果您实际查看Iterator interface definition,就会看到next()被定义为返回void

 Iterator extends Traversable {
    /* Methods */
    abstract public current ( void ) : mixed
    abstract public key ( void ) : scalar
    abstract public next ( void ) : void
    abstract public rewind ( void ) : void
    abstract public valid ( void ) : bool
}

您正在使用PHP 7.3无关。在过去的15年中,这种行为大致相同。