我正在寻找一种方法来防止重复调用数据库,如果之前已经加载了相关项目。原因是我们有很多不同的领域,显示热门项目,最新版本,最高评级等。有时会发生一个项目出现在同一页面上的多个列表中。
我想知道是否可以将对象实例保存在与该类关联的静态数组中,然后检查数据是否实际存在于那里,但是如何将新实例指向现有实例呢?
以下是我的想法草稿:
$baseball = new Item($idOfTheBaseballItem);
$baseballAgain = new Item($idOfTheBaseballItem);
class Item
{
static $arrItems = array();
function __construct($id) {
if(in_array($id, self::arrItems)){
// Point this instance to the object in self::arrItems[$id]
// But how?
}
else {
// Call the database
self::arrItems[id] = $this;
}
}
}
如果您有任何其他想法或者您认为我完全疯了,请告诉我。
答案 0 :(得分:1)
您应该知道静态变量只存在于它们创建的页面中,这意味着2个加载同一页面并获得相同脚本的用户仍然存在为2个不同的内存空间。
您应该考虑缓存结果,看看code igniter database caching
您想要达到的目标与单身工厂相似
$baseball = getItem($idOfTheBaseballItem);
$baseballAgain =getItem($idOfTheBaseballItem);
function getItem($id){
static $items=array();
if(!isset($items[$id])$items[$id]=new Item($id);
return $items[$id];
}
class Item{
// this stays the same
}
P.S。另请查看memcache。删除数据库负载的一种非常简单的方法是创建/ cache /目录并在那里保存数据库结果几分钟或直到您认为数据已经过时(这可以通过多种方式完成,但大多数方法都是基于时间的)
答案 1 :(得分:0)
您无法在构造函数中直接替换“this”。相反,准备一个静态函数,如“getById($ id)”,它从列表中返回对象。 如上所述:这仅适用于每页加载。