2011-08-04 10 views
5

を完了したとき、私はこの1つのようなイテレータを持っている:PHPイテレータ - 実行機能の反復が

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

そして私はどのようにオブジェクトが反復処理が終了したときに実行されるメソッドを実装することができます思っていました。 Iteratorを拡張するための例えば

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

答えて

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 
+0

有効なメソッドには副作用があるので、これは機能しません。よりクリーンなアプローチについては、私の答えを参照してください。 – Gordon

+0

@Gordonあなたは正しいです。 OPはあなたが示した方法を選択する必要があります。 – Yoshi

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

valid()をオーバーロードするイテレータの拡張は良い方法ではありませんそこに属しません。

class BeforeAndAfterIterator extends RecursiveIteratorIterator 
{ 
    public function beginIteration() 
    { 
     echo 'begin'; 
    } 
    public function endIteration() 
    { 
     echo 'end'; 
    } 
} 

、その後、彼らは、特にそのためのものですので、これらの2つの方法は、過負荷に大丈夫です

begin0 => 11 => 22 => 33 => 44 => 55 => 66 => 77 => 88 => 99 => 10end 

を与えることになる

$it = new BeforeAndAfterIterator(new RecursiveArrayIterator(range(1,10))); 
foreach($it as $k => $v) { 
    echo "$k => $v"; 
} 

の操作を行います。ややクリーナーアプローチが使用することですあらかじめ定義された振る舞いを持たない(私が親メソッドと呼んでいないことを覚えておいてください)。

関連する問題