我正在 PHP 中的数据库上构建一个抽象层。
我使用 PDO,一切都在纯命令式脚本中完美运行。
现在我想用 MVC 将这堆代码(一个 Web 服务 API)交换为 OOP 方法,我试图抽象 DB 接口以进行调用,例如(在竞赛数据库环境中)getRaceList(); 或 getRookieAthlets(); 等,并在其他任何地方展示它们。
如果我在要调用的持久性类中做这样的事情,它会完美地工作
class Persistantance{
//other methods
/**
* return all races
**/
public function getRaces(){
$result = null;
try {
$db = $this->connect(); //return a PDO object
$query = "SELECT races.title, races.year, races.id FROM races;";
//here use prepared statement statements if needed
$result = $db->query($query);
$races = array();
foreach ($result as $record) {
//here insert $record in $races
}
$result->closeCursor();
$db = null;
}catch(PDOException $e){
// Print PDOException message
echo $e->getMessage();
}
return $races;
}
}
class View{
public function viewRaces(){
//...
$races = $pers->getRaces();
foreach($races as $race)
printRecord($race);
//...
}
}
它会起作用,但就像 $stmnt->fetchAll() 它非常占用内存,因为它将所有内容都带入内存。Db 相当大,但由于想象力,我不太可能得到非常大的数组,但我想知道一个尽可能与大小无关的模式。另一方面,如果我构建一个迭代器,我会使 Persistance 接口复杂化很多(我想分发接口):
//from a view class
perist->a_query()
repeat untill null
perist->fetch_last_query_next()
perist->close_conn()
此外,如果不使具有多个迭代器方法的接口更加复杂,就不可能并行执行更多查询。