2012-11-23 32 views
1

爲簡潔起見,我將簡化示例;說我有一個index.php文件,在其中我實例庫類是這樣的:從存儲庫類文件中逐行讀取

$itemRepos = new ItemRepository(); 
$allItems = $itemRepos->getAll(); 

,並在可變$allItems這一點我有所有的記錄從數據庫中返回給我,現在我可以遍歷它們。

但現在,我需要(因爲內存問題)從數據庫中逐一讀取項目,當然,在index.php文件中,我可以建立與數據庫的連接並使用這樣的while循環例如:

while ($row = mysql_fetch_row($result)){ 
    //do stuff 
} 

,從而讀取行一個接一個,但我不想那樣做,我想知道我怎麼使用OOP原理實現同樣的事情,所以沒有把將db連接邏輯放入index.php文件中,並通過(以某種方式)將其放入Repository類中。

我確實認爲某種模式或'東西'已經存在,所以請把我推向正確的方向。

+2

要開始從不使用mysql_ *。看着PDO。查看ORM。 –

+1

ps,除了一次一個迭代迭代之外,您還需要查看'mysql_unbuffered_query()'。標準的'mysql_query()'完全緩衝了結果集,所以你將在大型結果集上遇到內存問題。 – goat

回答

1

當你不希望公開的實施細則,但仍希望能夠進行迭代,你應該使用Iterator pattern。其目的是提供一種統一的方式,客戶端可以迭代某些內容,同時保持底層實現封裝。

PDO爲結果集提供了一個迭代器,而無需編寫任何代碼。但是,如果您現在必須使用mysql_ *擴展名,則可以通過執行Iterator來編寫自己的迭代器。

您可能實際上在手冊中找到了一些用於使迭代器封裝mysql_ *結果集的示例代碼。

3

OOP中的代碼沒有問題。

只是做一個名爲getNext()新功能,將調用mysql_fetch_row()做:

while ($row = $itemRepos->getNext()) { 
    // ... 
}