2009-12-08 6 views
5

나는 정적 클래스 메서드를 가지고있다. 개체 변수 $ DB에 저장된 스크립트에 기존 데이터베이스 연결이 있습니다. 어떻게 그 정적 클래스 메서드를 호출하고 클래스 메서드에 매개 변수로 매번이 변수를 전달하지 않고 그 $ DB 개체를 사용할 수있게합니까? 예를 들어PHP : 기존 데이터베이스 연결을 정적 클래스 메서드에 전달하는 방법?

, 지금 나는 불행하게도, 글로벌을 사용하는 데 :

class Foo { 
    public static function Bar() { 
    global $DB; 
    return $DB->DSN_STRING; 
    } 
} 

그건 어떻게 든하지 않고 $의 DB 연결을 유도 할 수있는 일상적인 자신을 호출하는 내 정적 클래스가 필요 같은 그것을 다시 설정하십시오. 정적 클래스에 인스턴스를 삽입 할 수 없으므로 정적 클래스에 삽입 할 수 없습니다.

물론 정적 클래스에서 일반 클래스로 전환하고 내 $ Foo 객체를 인스턴스화하면 문제가 해결됩니다. 그런 다음 $ DB var을 공용 변수의 설정으로 삽입 할 수 있습니다. 또는 public 메서드를 추가하여 $ DB var을받은 다음 $ Foo 개체의 private var를 설정합니다. 또는 클래스 생성자가 $ DB var을 허용하고 $ Foo 객체의 private var를 설정합니다. 그러나 세 가지 기술 모두 정적 클래스에서 일반 클래스로 전환해야합니다.

일부 사람들은 레지스트리 패턴 또는 싱글 톤 패턴이라고도하는 것을 언급 한 적이 있습니다 (확실하지는 않습니다). 이 문제를 효율적으로 해결하는 데 필요한 것이 있습니까?

무엇보다도 나는 "global $ DB"라고 부르는 것을 피하는 이유는 사람들이 그것에 대해 괴롭힘을 당하기 때문입니다.

답변

10

나는 이것에 싱글 톤 패턴을 사용하고 싶습니다. 당신은 그냥 그때부터 Database_Manager :: getDb()를 호출 한 후 initializeConnection() 호출 한 번 일을 설정 할 수 있습니다

class Database_Manager 
{ 
    private static $instance; 
    private $db_connection; 

    public static function getInstance() 
    { 
     if (self::$instance == null) { 
      $className = __CLASS__; 
      self::$instance = new $className(); 
     } 
     return self::$instance; 
    } 

    public static function initializeConnection($connectionInfo) 
    { 
     $db = self::getInstance(); 
     //call init functions.. connect to db, etc 
      //save connection to $db->db_connection; 

    } 

    public static function getDb() 
    { 
     $db = self::getInstance(); 
     return $db->db_connection; 
    } 
} 

: 난 그냥 여기 Database_Manager 전화 할게 클래스를 사용합니다.

이 접근법에 대한 좋은 점은 여러 데이터베이스에 대한 연결을 쉽게 관리 할 수 ​​있다는 것입니다. 그리고 데이터베이스 당 하나의 연결 만 열 수 있습니다.

__construct() 함수를 비공개로 선언하는 것과 같은 Singleton 구현의 핵심은 생략했습니다 (위의 대부분은 메모리에서 복사 됨). 나는 전반적인 접근 방식을 보여 주기만했다.

+0

이것은 * 필자가 필요로하는 * * 정적 클래스가 그 안에 개체 지속성을 유지할 수 있다는 것을 깨닫지 못했습니다. – Volomike

+0

좋은 시간은 싱글 톤. :) 도와 줘서 기뻐. – zombat

3

저는 싱글 톤이 당신이하려는 일에 잘 작동한다고 생각합니다. 그렇지 않으면 당신은 이미 알았 듯이 극도로 비싼 '글로벌'키워드를 사용해야하는 것으로 제한됩니다.

+0

좋습니다. 나는 바른 길을 가고있다. 예를 들어 줄 수 있습니까? – Volomike

관련 문제