2011-11-01 4 views
2
class SingleTon 
{ 
    private static $instance; 

    private function __construct() 
    { 
    } 

    public function getInstance() { 
     if($instance === null) { 
      $instance = new SingleTon(); 
     } 
     return $instance; 
    } 
} 

위의 코드는이 기사의 싱글 톤 패턴을 묘사 한 것입니다. http://www.hiteshagrawal.com/php/singleton-class-in-php-5PHP의 싱글 톤 패턴

한 가지를 이해하지 못했습니다. 내 프로젝트에서이 클래스를로드하지만 초기에 Singleton 객체를 만드는 방법은 무엇입니까? 내가 이렇게 부르겠습니까 Singelton :: getInstance()

데이터베이스 연결이 설정된 곳에서 누군가 싱글 톤 클래스를 보여줄 수 있습니까?

+1

어떤'경우 ($ 예 === NULL) { $ 예 = 새로운 싱글 톤()의 일부; }'당신에게 불분명합니까? (참고 : Singleton, Singelon 또는 Singelton이 아닌 Singleton) – Piskvor

답변

10

는 데이터베이스 클래스의 싱글 톤 패턴을 구현하는 것이 방법의 예는 아래에서 볼 수 있습니다 :

class Database implements Singleton { 
    private static $instance; 
    private $pdo; 

    private function __construct() { 
     $this->pdo = new PDO(
      "mysql:host=localhost;dbname=database", 
      "user", 
      "password" 
     ); 
    } 

    public static function getInstance() { 
     if(self::$instance === null) { 
      self::$instance = new Database(); 
     } 
     return self::$instance->pdo; 
    } 
} 

당신은 다음과 같은 방법으로 클래스의 사용을 만들 것입니다 :

$db = Database::getInstance(); 
// $db is now an instance of PDO 
$db->prepare("SELECT ..."); 

// ... 

$db = Database::getInstance(); 
// $db is the same instance as before 

그리고 참조 용으로 인터페이스는 다음과 같습니다.

interface Singleton { 
    public static function getInstance(); 
} 
+0

부모의 싱글 톤 생성자는 parent :: __ construct ("mysql : host = localhost; dbname = database", "user", "password")와 비슷한 모양입니다. – theJava

+0

@theJava :이 예제에서는 PDO 클래스를 확장하므로 PDO의 ['__construct()'] (http://php.net/manual/pdo.construct.php)가 그 방법이 될 것입니다. –

+0

그래서 여기에 싱글 톤은 클래스보다 인터페이스입니다 ... 왜 그렇게할까요? – theJava

1

예,

SingleTon::getInstance(); 

처음은 null로, 그래서 스크립트가 $instance = new SingleTon();를 실행할 개인 VAR $instance을 테스트하여 호출 할 수 있습니다.

데이터베이스 클래스의 경우는 동일한 것입니다.

class Application_Model_Database 
{ 
    /** 
    * 
    * @var Zend_Db_Adapter_Abstract 
    */ 
    private static $Db = NULL; 

    /** 
    * 
    * @return Zend_Db_Adapter_Abstract 
    */ 
    public static function getDb() 
    { 
     if (self::$Db === NULL) 
     self::$Db = Zend_Db_Table::getDefaultAdapter(); 
     return self::$Db; 
    } 
} 

: 이것은 내가 젠드 프레임 워크에서 사용하는 클래스의 추출물 인 패턴, 싱글 싱글 아니다.

0

코드가 약간 수정되었습니다. getInstance 메소드가 '정적'인지 확인해야합니다. 즉, 인스턴스 메소드가 아닌 클래스 메소드입니다. 또한 'self'키워드를 통해 속성을 참조해야합니다.

일반적으로 완료되지는 않지만 "__clone()"메서드도 재정의해야 인스턴스의 복제가 중단됩니다.

<? 
class Singleton 
{ 
    private static $_instance; 

    private function __construct() { } 
    private final function __clone() { } 

    public static function getInstance() { 
     if(self::$_instance === null) { 
      self::$_instance = new Singleton(); 
     } 
     return self::$_instance; 
    } 
} 
?> 

$mySingleton = Singleton::getInstance(); 

단점은 하나의 테스트를 할 계획이라면 싱글 톤 패턴을 사용하면 약간의 어려움이 있다는 것입니다. 참조 http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

0
class Database{ 
    private static $link=NULL; 
    private static $getInitial=NULL; 

    public static function getInitial() { 
     if (self::$getInitial == null) 
     self::$getInitial = new Database(); 
     return self::$getInitial; 
    } 
    public function __construct($server = 'localhost', $username = 'root', $password ='tabsquare123', $database = 'cloud_storage') { 

     self::$link = mysql_connect($server, $username, $password); 
     mysql_select_db($database,self::$link); 
     mysql_query("SET CHARACTER SET utf8", self::$link); 
     mysql_query("SET NAMES 'utf8'", self::$link); 
     return self::$link; 
    } 

    function __destruct(){ 
      mysql_close(self::$link); 
    } 
} 
+0

작성한 코드에 대한 설명을 게시 할 수 있습니까? – NREZ