PHPでDB上に抽象化レイヤーを構築しています。
私は PDO を使用しており、すべてが純粋な命令型スクリプトで完全に機能します。
今、私はこの一連のコード (Web サービス API) を MVC を使用した OOP アプローチに交換したいと考えており、DB インターフェイスを抽象化して (レース 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()
さらに、複数の反復子メソッドを使用するインターフェイスをさらに複雑にしない限り、より多くのクエリを並行して実行することはできません。