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

通过类静态属性进行PHP对象缓存,php,oop,caching,Php,Oop,Caching,这是一个关于通过实现如下所示解决方案的总体性能的问题。我知道这可能有点基于观点,但我想知道是否有人清楚这是一个好的实现,或者是否应该以更好的方式解决 这只是一个示例,但让我们先创建一个名为Member的类。当我们列出数据库中的所有成员时,这将被实例化多次。现在,因为在这个例子中,这是一个古老而复杂的系统,每次显示完整的成员列表时,一个成员可以被实例化多次。因此,为了减少每次获取成员的整个操作,我们将实例化对象缓存在类的静态属性中,并返回它(如果它已经存在): class Member {

这是一个关于通过实现如下所示解决方案的总体性能的问题。我知道这可能有点基于观点,但我想知道是否有人清楚这是一个好的实现,或者是否应该以更好的方式解决

这只是一个示例,但让我们先创建一个名为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实例化
成员
类的次数。但是,当脚本结束时,这将依次释放(正确吗?)。所以,只要PHP有足够的内存分配,我的理解是这种实现没有其他缺点

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

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

一个打字错误:

$obj=new self()

静态
是保留关键字。您不能使用
newstatic()
@Syscall,您可以。请参阅和@simon,感谢您提供此信息。感谢您对仅引用已启动对象的说明。我没有想到。不,这不是一个打字错误:)请看原始问题评论中的链接。使用新的static();是一种有效的方法。很乐意帮忙。感谢您提供有关new static()的信息。学习新东西总是很棒的。