index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/IMooc/Loader.php';
spl_autoload_register('\\IMooc\\Loader::autoload');
$users = new IMooc\AllUser();
foreach($users as $user){
var_dump($user->name);
//还可以对属性修改
$user->name = rand(0,9) . 'aaa';
}
AllUser.php
<?php
namespace IMooc;
//一个迭代器的实现,必须继承 SPL 中的迭代器接口 \Iterator
class AllUser implements \Iterator
{
protected $ids;
protected $data = array();
protected $index;//表示迭代器当前位置
//先从数据库中将所有的id取出来
public function __construct()
{
$db = Factory::getDatabase();
$db->connect('localhost','root','123456','test1');
$result = $db->query("select id from user");
// var_dump($result);die;
$this->ids = $result->fetch_all(MYSQLI_ASSOC);
}
//对于一个迭代器来说,有5个方法必须实现
//重置整个迭代器,回到整个集合的开头
public function rewind()
{
$this->index = 0;
}
//验证当前是否还有下一个元素
public function valid()
{
//当前的 index 是否小于 $this->ids,如果大于表明没有下一个了
return $this->index < count($this->ids);
}
//获取当前元素
public function current()
{
$id = $this->ids[$this->index]['id'];
return Factory::getUser($id);
}
//下一个元素
public function next()
{
$this->index++;
}
//表示在迭代器中的位置
public function key()
{
return $this->index;
}
}
Factory.php
<?php
namespace IMooc;
class Factory
{
static function createDatabase()
{
$db = Database::getInstance();
//将 $db 映射到全局树上
Register::set('db1',$db);
return $db;
}
public static function getUser($id)
{
$key = 'user_' . $id;
$user = Register::get($key);
if(!$user){
$user = new User($id);
Register::set($key,$user);
}
return $user;
}
static function getDatabase()
{
$db = new Database\MySQLi();
return $db;
}
}