0

我有许多扩展抽象 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
}

不幸的是,所有子类共享相同的 static $cachedRecords

我可以通过static protected $cachedRecords;在所有子类中重新声明并$cachedRecords在 DatabaseRecord 中声明private以阻止我忘记重新声明来解决此问题,但这似乎是一个不雅的解决方案。

有没有更好的方法可以做到一劳永逸?

4

1 回答 1

1

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

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

    if( isset( self::$cachedRecords[$class][$id] ) )
    {
        return self::$cachedRecords[$class][$id];
    }
    else
    {
        return null;
    }
}
于 2013-09-27T08:36:48.110 回答