PHP iterator - запустить функцию после завершения итерации - PullRequest
5 голосов
/ 04 августа 2011

У меня есть такой итератор:

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 ]

3 голосов
/ 04 августа 2011

Пример расширения Итератора:

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
3 голосов
/ 04 августа 2011

Расширение итератора для перегрузки 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 голосов
/ 04 августа 2011
 function  valid(){
     $isValid=...;
     if(!$isValid)
        doStuff();
     return $isValid;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...