2010-03-20 2 views
0

에서 싱글 톤 패턴에 약간의 혼란 :은 내가이 스타일 같은 자원 클래스를 작성 들었다 우리 팀에서 PHP

class MemcacheService 
{ 
    private static $instance = null; 

    private function __construct() 
    { 

    } 

    public static function getInstance($fortest = false) 
    { 
     if (self::$instance == null) 
     { 
      self::$instance = new Memcached(); 

      if ($fortest) 
      { 
       self::$instance->addServer(MEMTEST_HOST, MEMTEST_PORT); 
      } 
      else 
      { 

       self::$instance->addServer(MEM_HOST, MEM_PORT); 
      } 
     } 

     return self::$instance; 
    } 
} 

그러나 내가 PHP 자원 핸들에 생각이 출시하고 이후 다시 때마다 초기화됩니다 요청하십시오. 즉, MemcacheService::getInstance()은 완전히 싱글 톤 패턴이라고 할 수없는 new Memcached()과 완전히 동일합니다. 내가 틀렸다면 나를 바로 잡아주세요.

감사

답변

1

당신은 PHP는 대부분의 자원을 해제 할 것을 맞아. 그러나 스크립트 실행 내에서 동일한 인스턴스를 여러 번 액세스하고 참조를 전달하지 않으면 "memcache 연결 인스턴스"를 유지하는 것이 합리적입니다. 근본적으로는 전역을 사용하는 것과 같습니다. 장기적으로.

(* 같은 지속적인 데이터베이스 연결과 같은 일부 연결은, 실제로 같은 공개되지 않으며, 이러한 연결을 요청하는 다음 스크립트가 이전에 오픈 한 백을 부여 할 수있다)

1

아니, 이것은 올바른 싱글 톤 패턴이다. getInstance()을 호출 할 때마다 self::$instance이 null인지 확인합니다. 이 null의 경우

if(self::$instance == null) 

, 그것은 다음 self::$instance이 null하게 Memcached가의 새로운 인스턴스를 작성하므로이 호출되는 다음 번에, 그 같은 인스턴스를 반환합니다. (있지만 아래 참조 파일 핸들, 데이터베이스 연결) 스크립트가 종료 될 때

self::$instance = new Memcached(); 
+0

하지만 나는 그것이 생각

if(self::$instance == null)
은 아무 것도하지 않습니다 ... – Young

+0

동일한 PHP 인스턴스 내에서'MemcacheService :: getInstance()'를 한 번만 호출하면됩니다. – VolkerK