PHP对象通过类静态属性进行缓存

时间:2018-02-02 10:04:51

标签: php oop caching

这是一个关于通过实施下面所示解决方案的一般性能的问题。我知道这可能是基于意见的,但我想知道是否有人清楚地知道这是一个好的实现,还是应该以更好的方式解决。

这只是一个例子,但我们先创建一个名为Member的类。当我们列出数据库中的所有成员时,这将被多次实例化。现在,因为在这个例子中,这是一个古老而复杂的系统,每次显示完整的成员列表时,可以多次实例化一个成员。因此,为了减少每次获取成员的整个操作,我们将实例化对象缓存在类的静态属性中,如果它已经存在则返回:

class Member {

    protected static $cachedMember = null;

    public static function get($id){
        if ( isset( self::$cachedMember[$id] ) ) return self::$cachedMember[$id];
        // If its not set, we fetch it from database...
        $obj = new static();    
        // Fetching member from database and applying the applicable values to $obj 
        // Then we set the filled $obj to the $cachedMember static. 
        self::$cachedMember[$id] = $obj;
        return $obj;
    }

}

显然,这会占用一些内存,具体取决于使用唯一成员ID实例化Member类的次数。但是当脚本结束时(这是正确的?)依次释放。所以只要PHP有足够的内存分配,我的理解是没有其他的缺点这个实现?

1 个答案:

答案 0 :(得分:1)

是的,该方法应该可以避免在脚本运行期间从数据库中多次获取具有相同ID的成员。

是的,内存在脚本结束时被释放,但内存在这里不应该是一个大问题,因为PHP只存储对静态数组中每个对象的引用,而不是对象本身。

一个错字:
$obj = new self();