2012-06-29 4 views
1

프로그램에서 여러 객체를 데이터베이스에 연결하는 것이 가장 효과적이었습니다.PHP 객체 간의 MySQL 연결 공유

정적 연결 var로 클래스를 만들었습니다. 이는 하나의 연결 만 열리고 모든 개체가이를 공유 함을 의미합니다.

class Database { 
    public static $mysql; 
    function __construct() { 
     if (!isset(self::$mysql)) { 
      echo "Make static connection\n"; 
      self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events"); 
      if (self::$mysql->connect_errno) { 
       echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error; 
      } 
      echo self::$mysql->host_info . "\n"; 
     } 
    } 
} 

정상적인 개체 버전입니다. 이것은 그것을 사용하는 각 객체에 대한 새로운 연결을 만듭니다.

class Database { 
    public $mysql; 
    function __construct() { 
     if (!isset($this->mysql)) { 
      echo "Make connection\n"; 
      $this->mysql = new mysqli("localhost", "gamalert", "c45ualty", "events"); 
      if ($this->mysql->connect_errno) { 
       echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . $this->mysql->connect_error; 
      } 
      echo $this->mysql->host_info . "\n"; 
     } 
    } 

내가 선호하는 옵션이 무엇인지 궁금한가요? 나중에 성능 차이를 테스트 할 계획입니다.

+0

선호하는 버전은 정적 메서드로 전역 네임 스페이스를 오염시키는 대신 인스턴스 (두 번째)를 만드는 것입니다. –

+0

['singleton'] (http://en.wikipedia.org/wiki/Singleton_pattern) 사용을 고려 했습니까? – Havelock

+1

@ DanLee 당신은 그가 글로벌 네임 스페이스를 어디서 오염 시켰는가? 그는 여기에 싱글 톤 패턴을 적용하고 있습니다 (다소). 제 2의 방법은 요청 당 다중 쿼리/연결의 경우 더 많은 오버 헤드를 생성하기 때문에 MySQL 연결 재사용이 더 나은 것으로 제 1 방법을 선호합니다. –

답변

0

데이터베이스에 연결하는 것은 매우 비용이 많이 드는 작업이므로 여러 연결을 만들지 않아야합니다. 따라서 당신은 당신의 정상적인 대상을 포기해야합니다.

정적 변수를 사용하는 것이 더 좋지만 이상적인 것은 아닙니다. 모든 클래스에서이 생성자를 복사하는 것에 대해 기억해야합니다. 이와 관련하여 뭔가를 변경하고 싶다면? 그런 다음 모든 클래스를 열고 모든 클래스를 변경해야합니다.

나는 추상적 인 객체 Database을 만들고 그것을 클래스와 함께 확장해야한다고 생각한다. 이 연결을 사용하는 새로운 객체를 생성

그리고는 간단하다

class ExtDatabase extends Database { 
    public function __construct() { 
     echo "Executing parent..."; 
     parent::__construct(); 
    } 

    public function hostInfo() { 
     //no problem with using connection there 
     echo self::$mysql->host_info . "\n"; 
    } 
} 

하지만 ... 그것도하지 excelent 옵션을 선택합니다. 더 나은 연결과 추상적 인 데이터베이스 클래스와 싱글 톤을 사용합니다.