代码之家  ›  专栏  ›  技术社区  ›  PHPFan

在foreach循环期间如何调用迭代器接口中的方法,以及它们的返回值会发生什么变化?[闭门]

  •  -2
  • PHPFan  · 技术社区  · 7 年前

    这些方法是如何和何时使用的 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 回复  |  直到 7 年前
        1
  •  1
  •   yivi SilverLink    7 年前

    这四个方法返回的值在 foreach 迭代:

    1. valid() 被称为。如果它回来 false ,循环退出。此值不会存储在任何位置,并且会丢失。

    2. $a $b 在您的示例中),是初始化的 current() key() .

      A. $a = key()

      $b = current() .

    3. 循环体运行后, next() 下一个() Iterator interface definition ,你会看到的 下一个() 定义为返回 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
    }
    

    您正在使用PHP7.3与此无关。在过去的15年里,这种行为大致相同。