PHP迭代器 - 迭代完成时运行函数

时间:2011-08-04 14:44:24

标签: php arrays oop iterator

我有一个像这样的迭代器:

http://nz.php.net/manual/en/class.iterator.php

我想知道如何实现在对象完成迭代时运行的方法。

例如

foreach($objects as $object){
  ...
}
// here it's finished, and I want to automatically do something 

3 个答案:

答案 0 :(得分:3)

扩展迭代器的示例:

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

答案 1 :(得分:3)

将迭代器扩展为重载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

这两种方法可以重载,因为它们专门用于此目的并且没有预定义的行为(请注意,我没有调用父方法)。

答案 2 :(得分:2)

 function  valid(){
     $isValid=...;
     if(!$isValid)
        doStuff();
     return $isValid;
 }