我有许多类可以扩展抽象的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
。
我可以通过在所有子类中重新声明static protected $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;
}
}