Кэширование через статические свойства в PHP

У меня есть несколько классов, расширяющих абстрактный класс DatabaseRecord. По сути, класс DatabaseRecord обрабатывает некоторые общие функции, которые все дочерние классы используют при взаимодействии с базой данных (например, поиск по идентификатору, обновление и т. д.).

Теперь я хотел бы, чтобы мне не приходилось постоянно обращаться к БД для извлечения записи каждый раз, например, когда конкретный пользователь упоминается при загрузке страницы. У меня была в меру гениальная идея, чтобы я мог сделать следующее, так как 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; во всех дочерних классах и объявив $cachedRecords в DatabaseRecord как private, чтобы не забыть переобъявление, но это кажется неэлегантным решением.

Есть ли лучший способ сделать это, чтобы написать один раз и забыть?


person waiwai933    schedule 27.09.2013    source источник


Ответы (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;
    }
}
person feeela    schedule 27.09.2013