2012-03-07 2 views
1

생성자를 사용하여 투명한 (나쁨) 캐싱을 사용할 수 있고 일부 팩토리 메서드를 사용하지 못하도록하고 싶습니다.생성자 내에서 PHP 개체 캐싱

$a = new aClass();이 개체가 캐시에 있는지 확인하고 존재하지 않는 경우 캐시를 만들어 캐시에 추가해야합니다.

일부 의사 코드는 : 당신이 PHP에서 $this을 재정의 할 수 없기 때문에

class aClass { 
    public function __construct($someId) { 
     if (is_cached($someId) { 
      $this = get_cached($someId); 
     } else { 
      // do stuff here 
      set_cached($someId, $this); 
     } 
    } 
} 

불행하게도, 이것은 불가능하다.

제안 사항?

+0

및 공장 관련 문제가 있습니까? – SergeS

+0

우선 투명성을 원하고 두 번째로 수십만 줄의 코드를 다시 작성하고 싶지 않습니다. –

답변

3

ctors가 반환되지 않고 $this을 다시 정의 할 수 없기 때문에이 방법은 작동하지 않습니다.

는 대신 정적 팩토리 메소드를 사용할 수 있습니다

class Foo 
{ 
    protected static $instances = array(); 

    public function getCachedOrNew($id) 
    { 
     if (!isset(self::$instances[$id])) { 
      self::$instances[$id] = new self; 
     } 
     return self::$instances[$id]; 
    } 
} 

$foo = Foo::getCachedOrNew(1); 
$foo->bar = 1; 
$foo = Foo::getCachedOrNew(1); 
echo $foo->bar; // 1 

또 다른 객체 인스턴스를 관리 할 수있는 의존성 삽입 컨테이너 (DIC)를 사용하는 것입니다. 이것을 위해 The Symfony Componenent DIC.을보십시오.

+0

앞서 언급했듯이 팩토리 메서드를 사용하여 객체를 만들고 싶지 않습니다. 투명한 캐싱이 필요합니다. 하지만이게 PHP로 불가능한 것 같습니다. –

+0

@BerndGoldschmidt right. 불가능한. – Gordon