[ create a new paste ] login | about

Link: http://codepad.org/Fcyu4AeB    [ raw code | output | fork ]

k4st - PHP, pasted on Dec 9:
<?php

class Query {
    public function execute() {
        
        echo "Calling Query::execute()\n";
        
        return new ArrayIterator(array(
            'hello',
            'world',
        ));
    }
}

abstract class Lazy {
    private $lazy_variables = array();
    
    protected function __get($key) {
        echo "Calling Lazy::__get()\n";
        
        if(isset($this->lazy_variables[$key])) {
            return $this->$key = call_user_func($this->lazy_variables[$key]);
        }
        
        return NULL;
    }
    
    protected function registerLazyVariable($var, $callback) {
        $this->lazy_variables[$var] = $callback;
    }
}

class LazyIterator extends Lazy implements Iterator {
    
    protected $query;
    
    public function __construct(Query $query) {
        $this->query = $query;
        $this->registerLazyVariable('iterator', array($this, 'getInstance'));
    }
    
    protected function getInstance() {
        echo "Calling LazyIterator::getInstance()\n";
        return $this->query->execute();
    }
    
    public function next() {
        $this->iterator->next();
    }
    
    public function key() {
        return $this->iterator->key();
    }
    
    public function current() {
        return $this->iterator->current();
    }
    
    public function valid() {
        return $this->iterator->valid();
    }
    
    public function rewind() {
        $this->iterator->rewind();
    }
}

$lazy_it = new LazyIterator(new Query);

foreach($lazy_it as $key => $val)
    echo "{$val}\n";

echo "\n";

foreach($lazy_it as $key => $val)
    echo "{$val}\n";


Output:
1
2
3
4
5
6
7
8
Calling Lazy::__get()
Calling LazyIterator::getInstance()
Calling Query::execute()
hello
world

hello
world


Create a new paste based on this one


Comments: