2008-08-25 13 views
35

내가 싱글 톤을위한 PHP (> = 5.0) 클래스를 작성한다고 가정 해 보겠습니다. 내가 읽은 모든 문서는 클래스 생성자를 private으로 만들어 클래스를 직접 인스턴스화 할 수 없다고 말합니다. 나는 이런 식으로 뭔가가있는 경우PHP5 클래스에서 개인 생성자는 언제 호출됩니까?

그래서 :

class SillyDB 
{ 
    private function __construct() 
    { 

    } 

    public static function getConnection() 
    { 

    } 
} 

내가 클래스 자체 내부

new SillyDB() 

전화를하고 있어요 경우보다 __construct()가 다른이라고 어떤 경우가 있습니까?

그리고 왜 내부에서 SillyDB를 인스턴스화 할 수 있습니까?

답변

61

__construct()은 개인 생성자가 포함 된 클래스의 메서드 내에서 호출 한 경우에만 호출됩니다. 당신의 싱글을위한 그래서, 당신과 같이하는 방법이있을 수 있습니다 :

class DBConnection 
{ 
    private static $Connection = null; 

    public static function getConnection() 
    { 
     if(!isset(self::Connection)) 
     { 
     self::Connection = new DBConnection(); 
     } 
     return self::Connection; 
    } 

    private function __construct() 
    { 

    } 
} 

$dbConnection = DBConnection::getConnection(); 

당신이 할 수있는 이유를/자체 내에서 클래스를 인스턴스화 할 것입니다 당신은 하나의 인스턴스 만 존재 있는지 확인 확인할 수 있도록이다 어떤 주어진 시간. 이것은 결국 싱글 톤의 요점입니다. 데이터베이스 연결에 싱글 톤을 사용하면 응용 프로그램이 한 번에 많은 수의 DB 연결을 만들지 않도록 할 수 있습니다.

0

약간의 니트 따기 : 당신이 누군가이 클래스를 서브 클래스 자체 public 생성자를 구현하기를 원하지 않을 것이기 때문에 당신은 아마 이 너무 최종로 클래스를 선언 할 것 완성도를 들어.

(컴파일러 개인 생성자의 최우선을 잡으면 용서,하지만 난 그것을하지 생각하지 않는다) 코드, 마크

+2

그건 의견이 아닌 대답이지만 좋은 지적입니다. –

2

테스트, 나 당신이 찾아 알려주세요.

편집 : 또한이 특정 상황에서 사용자가 하위 클래스 화하는 것을 방지해야하는 이유에 대해 확신 할 수 없습니다. 누군가가 PHP 코드를 하위 클래스에 액세스 할 수 있으면 코드에 액세스하여 코드를 복사하고 액세스 한정자를 (어떤 이유로 든) 적합한 것으로 변경하는 코드에 액세스 할 수 있습니다.

이 경우 Singleton의 실질적인 유용성은 사용하면 주어진 HTTP 요청에 대해 항상 동일한 데이터베이스 연결을 사용한다는 것입니다. 그것은 그것을 성취합니다. 다른 것들 (final과 개인 생성자 사용)은 이론의 관점에서 알기에 유용하며, 다른 프로그래머에게 API 수준의 코드를 배포하려는 경우에 더 유용하지만,이 특정 예에서는 모든 키워드 클래스 파일의 크기에 바이트를 추가하는 것입니다.

$date1 = TheDate::getDateInstance(); 
echo $date1->getDateVal() . "<br />"; 

$date2 = TheDate::getDateInstance(); 
echo $date2->getDateVal() . "<br />"; 

그리고이 아무튼 일이 같은 일을

class TheDate 
{ 
    private static $DateInstance = null; 
    private $dateVal; 

    public static function getDateInstance() 
    { 
     if(!isset(self::$DateInstance)) 
     { 
      self::$DateInstance = new TheDate(); 
     } 

     return self::$DateInstance; 
    } 

    public static function getDateVal() 
    { 
     return self::$DateInstance->dateVal; 
    } 

    private function __construct() 
    { 
     $this->dateVal = strftime("%Y-%m-%d %H:%M:%S"); 
    } 
} 

분명히 반복해서 나에게 동일한 날짜를 제공합니다

6

여기에 단지 날짜/시간 문자열을 생성하는 매우 간단한 싱글입니다 어떤 오류라도 생성하지 마십시오 :

class NewDate extends TheDate 
{ 
    public function __construct() 
    { 

    } 
} 
4

좋아, 나는 내 자신의 일부 검사를 실행했습니다.

  • 당신이 슈퍼 클래스의 생성자를 호출하려고하기 때문에 그것이 치명적인 오류가 발생합니다 인스턴스화하려고, 서브 클래스에서 자신의 생성자를 선언하지 않으면

    .
  • DB 연결의 경우, 아마도 mysqli 인스턴스 또는 mysql_connect() 함수 (또는 다른 RDBMS에 대한 다른 링크)에 의해 반환 된 리소스를 (PHP에서는 어쨌든) 반환 할 때, 인스턴스를 비공개로 설정하면 하위 클래스를 하위 클래스로 지정하고 링크를 변경하지 않아도됩니다.
  • 이전에 언급했듯이 누군가가 자신의 행동을 무효화하고 여러 연결을 원할 경우 새로운 클래스를 작성하여이를 수행 할 수도 있습니다.