【发布时间】:2011-10-20 02:02:15
【问题描述】:
我有一个像这样的迭代器:
http://nz.php.net/manual/en/class.iterator.php
我想知道如何实现一个在对象完成迭代时运行的方法。
例如
foreach($objects as $object){
...
}
// here it's finished, and I want to automatically do something
【问题讨论】:
我有一个像这样的迭代器:
http://nz.php.net/manual/en/class.iterator.php
我想知道如何实现一个在对象完成迭代时运行的方法。
例如
foreach($objects as $object){
...
}
// here it's finished, and I want to automatically do something
【问题讨论】:
扩展迭代器的示例:
class Foo extends ArrayIterator
{
public function valid() {
$result = parent::valid();
if (!$result) {
echo 'after';
}
return $result;
}
}
$x = new Foo(array(1, 2, 3));
echo 'before';
foreach ($x as $y) {
echo $y;
}
// output: before123after
【讨论】:
将迭代器扩展为重载valid() 不是一个好方法,因为您将功能添加到不属于那里的 valid() 中。一种更清洁的方法是使用:
class BeforeAndAfterIterator extends RecursiveIteratorIterator
{
public function beginIteration()
{
echo 'begin';
}
public function endIteration()
{
echo 'end';
}
}
然后做
$it = new BeforeAndAfterIterator(new RecursiveArrayIterator(range(1,10)));
foreach($it as $k => $v) {
echo "$k => $v";
}
然后会给出
begin0 => 11 => 22 => 33 => 44 => 55 => 66 => 77 => 88 => 99 => 10end
这两个方法可以重载,因为它们专门用于该目的并且没有预定义的行为(请注意,我没有调用父方法)。
【讨论】:
function valid(){
$isValid=...;
if(!$isValid)
doStuff();
return $isValid;
}
【讨论】: