我正在尝试了解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
答案 0 :(得分:1)
这四个方法返回的值在foreach
迭代过程中按如下方式使用:
在每次迭代开始时,将调用valid()
。如果返回false
,则循环退出。此值不会存储在任何地方,并且会丢失。
在每次迭代中,调用$a
和$b
初始化循环变量(在您的示例中为current()
和key()
)。
a。 $a = key()
b。 $b = current()
。
循环的主体运行之后,将调用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年中,这种行为大致相同。