2012-11-23 31 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()) { 
    // ... 
}