在PHP中通过静态属性进行缓存

在PHP中通过静态属性进行缓存,php,static,access-specifier,late-static-binding,Php,Static,Access Specifier,Late Static Binding,我有许多扩展抽象DatabaseRecord类的类。基本上,DatabaseRecord类处理所有子类在与数据库交互时使用的一些常见函数(例如,按id搜索、更新等) 现在,我不想每次都去数据库获取记录,例如,某个特定用户在页面加载时被引用。我有一个相当巧妙的想法,这样我就可以做到以下几点,因为PHP具有后期静态绑定 abstract class DatabaseRecord{ static protected $cachedRecords; public static func

我有许多扩展抽象DatabaseRecord类的类。基本上,DatabaseRecord类处理所有子类在与数据库交互时使用的一些常见函数(例如,按id搜索、更新等)

现在,我不想每次都去数据库获取记录,例如,某个特定用户在页面加载时被引用。我有一个相当巧妙的想法,这样我就可以做到以下几点,因为PHP具有后期静态绑定

abstract class DatabaseRecord{
    static protected $cachedRecords;

    public static function searchById($id){
        if(!isset(static::$cachedRecords[$id])) {
              // logic
              static::$cachedRecords[$id] = static::constructFromDatabase($results);
        }
        return static::$cachedRecords[$id];
    }
    // ... more logic
}
不幸的是,所有子类共享相同的静态
$cachedRecords

我可以通过重新声明受静态保护的$cachedRecords来解决这个问题在所有子类中,并将DatabaseRecord中的
$cachedRecords
声明为
private
,以防止我忘记重新声明,但这似乎是一个不雅观的解决方案


有没有更好的方法来实现这一点,即“写一次就忘了”呢?

您可以在
$cachedRecords
数组中添加另一个级别来指示实际的类:

static public function cache( $id )
{
    $class = get_called_class();

    if( isset( self::$cachedRecords[$class][$id] ) )
    {
        return self::$cachedRecords[$class][$id];
    }
    else
    {
        return null;
    }
}