2013-02-04 2 views
1

mysql 연결 페이지의 php.net에서 db 어댑터를 발견했습니다.
이것은 꽤 많이 볼 수있는 페이지입니다 (저는 상상할 것입니다).
DB 어댑터가 php.net에서 발견되었습니다

작성자가 싱글 톤 패턴 클래스라고 주장하는 것을 포함합니다. http://php.net/manual/en/function.mysql-connect.php

작가에 찾을 수

는 말한다 :

"여기에 하나의 데이터베이스 연결을 관리하는 싱글 톤 클래스 년대 열기 방법은 통해 INI 파일 에서 읽을 defautls 같은 상수 값을 사용합니다. 이니셜 라이저 스크립트는 각 웹 페이지의 맨 위에로드됩니다. 은 수동으로 직접 입력하여 기본값을 무시할 수도 있습니다 ( 경우 서버 또는 데이터베이스 이름을 중간 스크립트로 전환해야 함). 함수는 준비된 문을 반환하고 첫 번째 연관 행, 첫 번째 셀 또는 두 번째 매개 변수 (생략 된 경우 전체 결과)를 기반으로 한 전체 결과 집합을 반환합니다.

사용법 : $ DB = DB :: Open();
$ result = $ DB-> qry ("{SQL 문};");

<?php 
    abstract class Database_Object 
    { 
     protected static $DB_Name; 
     protected static $DB_Open; 
     protected static $DB_Conn; 

     protected function __construct($database, $hostname, $hostport, $username, $password) 
     { 
      self::$DB_Name = $database; 
      self::$DB_Conn = mysql_connect($hostname . ":" . $hostport, $username, $password); 
      if (!self::$DB_Conn) { die('Critical Stop Error: Database Error<br />' . mysql_error()); } 
      mysql_select_db(self::$DB_Name, self::$DB_Conn); 
     } 

     private function __clone() {} 

     public function __destruct() 
     { 
//   mysql_close(self::$DB_Conn); <-- commented out due to current shared-link close 'feature'. If left in, causes a warning that this is not a valid link resource. 
     } 
    } 

    final class DB extends Database_Object 
    { 
     public static function Open($database = DB_NAME, $hostname = DB_HOST, $hostport = DB_PORT, $username = DB_USER,$password = DB_PASS) 
     { 
      if (!self::$DB_Open) 
      { 
       self::$DB_Open = new self($database, $hostname, $hostport, $username, $password); 
      } 
      else 
      { 
       self::$DB_Open = null; 
       self::$DB_Open = new self($database, $hostname, $hostport, $username, $password); 
      } 
      return self::$DB_Open; 
     } 

     public function qry($sql, $return_format = 0) 
     { 
      $query = mysql_query($sql, self::$DB_Conn) OR die(mysql_error()); 
      switch ($return_format) 
      { 
       case 1: 
        $query = mysql_fetch_row($query); 
        return $query; 
        break; 
       case 2: 
        $query = mysql_fetch_array($query); 
        return $query; 
        break; 
       case 3: 
        $query = mysql_fetch_row($query); 
        $query = $query[0]; 
        return $query; 
       default: 
        return $query; 
      } 
     } 
    } 
?> 

나는 질문이 하나의 코드를 살펴본 후,이 싱글 (DB 클래스와 열기 기능을 참조하십시오) 정말?

정적 속성으로 인해 싱글 톤 패턴이 작동합니까?

+1

이 확장 기능은 PHP 5.5.0부터 제공되지 않을 예정이며 앞으로 삭제 될 예정입니다. 대신 MySQLi 또는 PDO_MySQL 확장을 사용해야합니다. 자세한 내용은 MySQL : API 가이드 선택 및 관련 FAQ를 참조하십시오. – Chris

+0

안녕하세요, @ 크리스 당신은 바로 감사합니다. oop 원리와 싱글 톤 패턴에 관심이 있습니다. 감사합니다 –

+1

좋은 싱글 톤 구조는 이것입니다 : http://stackoverflow.com/questions/8994541/php-dont-allow-object-to-instantiate-more-than-once/8994589#8994589 체크 아웃 : – Chris

답변

1

내가 무슨 뜻인지 알겠지만, self::$DB_Open이 존재하는 경우 null로 설정하고 어쨌든 개체의 새 인스턴스를 만듭니다.

당신이 옳아 보이고 이것은 싱글 톤 패턴처럼 보이지 않습니다.

정적 속성이있는 싱글 톤 패턴에 관해서. 개체 범위가 인 인스턴스 변수와 달리 정적 변수는 클래스 범위입니다.
이것은 개체를 여러 번 만들더라도 매번 정적 속성에 대해 동일한 값을 계속 사용한다는 것을 의미합니다. 그것은 카운터와 글로벌 싱글 톤에 유용합니다.

은 아래를 참조하십시오 :

Class A { 
static int y=1; 
int x=3; 
} 
$newA = new A(); 
$newB = new A(); 
$newC = new A(); 

은 위의 X의 3 개 인스턴스를 생성합니다. 1 인스턴스에서 변경을 수행 할 수 있으며 해당 인스턴스에서 변경 만 수행합니다.
그러나 y 인스턴스가 하나만 만들어집니다. 그래서 1과 3의 변화가 바뀔 것입니다. 그것들은 모두 같은 맥락에서 존재합니다. 따라서 같은 값을 가리 키십시오. 하나를 증가 시키면 다른 증분이 같은 증분을 표시합니다.

DB_Conn의 단일 인스턴스 만 존재하더라도 계속 반복하여 다시 기록합니다 (다시 작동해야 할 필요는 없습니다). 이처럼).

작성자는 문제가있을 경우 self::$DB_Open 속성을 반환 할 수 있습니다.

+0

아 정적 변수가 전역 변수가 될 수 있으므로 (정적 메서드와 같은) 언제든지 같은 정적 변수에 액세스 할 수 있고 동일한 값을 가리킬 수 있으므로 전역 변수가 될 수 있습니다. 감사 –

관련 문제