<?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";