【问题标题】:PHP iterator - run function when iteration completesPHP迭代器 - 迭代完成时运行函数
【发布时间】: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 

【问题讨论】:

    标签: php arrays oop iterator


    【解决方案1】:

    扩展迭代器的示例:

    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
    

    【讨论】:

    • 虽然有效,但这样做很脏,因为有效的方法现在有副作用。请参阅我的答案以获得更清洁的方法。
    • @Gordon 你是对的。 OP 应该选择你展示的方法。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
       function  valid(){
           $isValid=...;
           if(!$isValid)
              doStuff();
           return $isValid;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2023-03-20
        • 1970-01-01
        • 2020-08-11
        • 2020-03-10
        • 2019-06-04
        • 1970-01-01
        相关资源
        最近更新 更多