Pues algo así podría funcionar:
Código PHP:
Ver original<?php
class Query implements Iterator
{
private $_limit;
private $_offset;
private $_query;
private $_executed;
private $_sampleData = array( 'row1',
'row2',
'row3',
'row4',
'row5',
'row6',
'row7',
'row8',
'row9',
'row10'
);
public $_position;
public function __construct()
{
$this->_query = 'SELECT * FROM foo';
$this->_position = 0;
$this->_executed = false;
}
public function limit($results)
{
$this->_query .= " LIMIT $results";
return $this;
}
public function offset($results)
{
$this->_query .= " OFFSET $results";
return $this;
}
public function __toString()
{
return $this->_query;
}
public function __invoke()
{
$query = (string) $this->__toString();
echo "Executing $query";
$this->_position = 0;
$this->_executed = true;
return $this->_sampleData;
}
public function isExecuted()
{
return $this->_executed;
}
public function execQuery()
{
$query = $this->__toString();
echo "Executing $query";
$this->_position = 0;
$this->_executed = true;
}
{
if (!$this->isExecuted()) {
$this->execQuery();
}
$this->_position = 0;
}
{
return $this->_sampleData[$this->_position];
}
{
return $this->_position;
}
{
++$this->_position;
}
public function valid()
{
return isset($this->_sampleData
[$this->_position
]); }
}
$query = new Query();
$query1 = clone $query;
$query2 = clone $query;
$query3 = clone $query;
foreach($query1->limit(10) as $data) {
}
foreach($query1->limit(10) as $data) {
}
foreach($query2->offset(10) as $data) {
}
foreach ($query3->limit(10)->offset(10) as $data) {
}