SPL
我已经从迭代器扩展和实现了。
但是如果我想使用它,我应该在foreach
.
我试图while
像这样使用它:
$news = new testClass();
while( $row = $news )
echo $row["name"];
它将创建一个无限循环!
但是对于foreach,它工作正常!
这是我班上的佼佼者:
class testClass implements \Iterator
错误在哪里?
拳头,勇敢地使用SPL
此类“标准”问题的类。我经常看到缺乏经验/草率的开发人员(甚至是那些根本不提前考虑的优秀开发人员)在这些类型的情况下重新发明轮子。
您缺少有关iterator
接口实现的一些非常重要的细节。
有关更多信息,请参阅PHP:Iterator - Manual以及下面的参考实现。
首先,您需要实现rewind, current, key, next, and valid
函数。参考实现如下所示:
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",
);
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) {
var_dump($key, $value);
echo "\n";
}
foreach
是遍历所有元素的语言结构。while
执行代码块,直到给定条件为真。要使其工作,您必须使用自己的函数来检查有效键并返回当前元素。
最后我创建了一个简单的例子:
<?php
/**
* @author Soroush Khosravi
* @copyright 2013
*/
class _Iterator
{
private $array;
public function setArray(array $data)
{
$this->array = $data;
}
public function reader()
{
if (is_null($this->array))
return false;
$elem = array_shift($this->array);
if (count ($this->array) > 0)
return $elem;
return false;
}
}
Class child extends _Iterator
{
function execute()
{
$this->setArray(array(1,2,3,4,5,6));
return $this;
}
}
$obj = new child;
$obj = $obj->execute();
while($row = $obj->reader())
echo $row;
?>