2013-09-27 2 views
0

나는 추상적 인 DatabaseRecord 클래스를 확장하는 많은 클래스가 있습니다. 기본적으로 DatabaseRecord 클래스는 모든 하위 클래스가 데이터베이스와 상호 작용할 때 사용하는 몇 가지 공통 함수 (예 : ID로 검색, 업데이트 등)를 처리합니다.PHP의 정적 속성을 통한 캐싱

이제는 매번 레코드를 가져 오기 위해 DB로 이동하지 않아도됩니다. 예를 들어, 특정 사용자가 페이지로드시 참조됩니다. 나는 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;를 재 선언하고 재 선언을 잊어 버리는 날 막을 private을 할 DatabaseRecord에서 $cachedRecords를 선언함으로써이 문제를 해결할 수 있지만, 이것은 우아 솔루션을 보인다.

일회성 일회용이므로 더 좋은 방법이 있습니까?

답변

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; 
    } 
}