2012-03-29 8 views
1

나는 내 PHP 응용 프로그램 내부에 그사용하여 DB 연결

class db { 

    protected $db; 

    public function __construct() { 
     $this->connect(); 
    } 

    protected function connect() { 
     $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); 
     $this->db->set_charset('utf8'); 
    } 

} 

모든 클래스처럼 보인다 DB 클래스가이 DB 클래스에게

처럼
class registration extends db { 

    var $validation; 

    function __construct() { 
     parent::__construct(); 
     $this->validation = new validation(); 
... 

및 검증 외모를 확장 like

class validation extends db { 

    var $ajax, $common; 

    function __construct() { 
     parent::__construct(); 
... 

"너무 많은 연결"오류 메시지가 나타납니다. 나는 이것이 옳은 접근법이 아니라는 것을 느낀다 : 나는 언제나 DB에 다시 연결된다. 그렇다면 귀하의 의견에 옳은 길은 무엇입니까? 그것은 ('db', ...) 1 시간을 정의하고 앱 내부의 모든 곳에서 사용할 수 있습니까?

답변

0

대신 여기에서 구성을 사용하고 싶습니다. 또한 싱글 톤 패턴을 조사하는 것도 고려해 볼 수 있습니다.

이 조성물을 이용하여, 정교하게하려면 라이브러리의 각 클래스는 오히려 보다 db 클래스의 인스턴스가 db 클래스의 인스턴스가 될 것입니다.

싱글 톤은 데이터베이스 연결과 같은 공유 리소스에 유용한 클래스의 인스턴스 하나만 생성하도록 db 클래스를 적용합니다. 주제에 대한 자세한 내용은이 링크를 참조하십시오.

http://php.net/manual/en/language.oop5.patterns.php

편집 : DB 인스턴스를 구성하는 수업의 나머지 부분을 개정 싱글 톤

<?php 
class db 
{ 
    static private $_oInstance = null; 
    protected $db; 

    private function __construct() 
    { 
     $this->connect(); 
    } 

    static public function getInstance() 
    { 
     if(self::$_oInstance === null) 
      self::$_oInstance = new db(); 
     return self::$_oInstance(); 
    } 

    protected function connect() 
    { 
     $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); 
     $this->db->set_charset('utf8'); 
    } 

} 

에 DB 클래스를 켜기 몇 가지 코드

을 추가하기보다는 DB 클래스를 확장

class registration 
{ 
    private $_oDb; 
    public $validation; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->_oDb = db::getInstance(); 
     $this->validation = new validation(); 
    } 

    // ... 
} 
+0

db 연결을 정의 할 수 있습니까? – heron

+0

네,'db' 클래스는 본질적으로 현재 디자인과 변함이 없습니다. 응용 프로그램의 나머지 코드와의 관련성을 변경하는 것입니다. – quickshiftin

+0

이 접근 방식에서 '문제'는 _any_ 클래스가 데이터베이스 리소스에 액세스 할 수 있다는 것입니다. 두 번째 데이터베이스에 연결할 수 없습니다. 그리고 당신은 당신의 코드가'db'의 서브 클래스를 사용할 수 없습니다. 의존성 주입은 일반적으로 모듈화, 유지 보수 및 테스트와 관련하여 우수한 패러다임으로 간주됩니다. – Halcyon

1

registrationvalidation클래스를 사용하며db이지만 하위 클래스는 아닙니다. 당신은 그것을 필요로하는 모든 클래스에 $db의 인스턴스에 대한 참조를 전달

$db = new DB(); 
$db->connect(); 
$registration = new Registration($db); 

class Registration { 

    private $db; 

    public function __construct(DB $db) { 
     $this->db = $db; 
     ... 

: 같은

코드는 보일 것입니다.

너무 많은 연결을 여는 이유는 현재 각 클래스가 데이터베이스에 연결되어 있기 때문입니다. 이는 사용자가 원하는 또는 수행 할 필요가 없기 때문일 수 있습니다.

+0

db 연결을 정의 할 수 있습니까? – heron

+0

@epic_syntax, 네, 여기서도 연결을 정의 할 수 있습니다. 이 솔루션은 응용 프로그램에서 인스턴스화 될 때'db' 클래스의 인스턴스를 다른 모든 클래스에 전달한다는 점을 제외하고는 다른 솔루션과 같습니다. 반면에 Singleton에서는 각 클래스가 클래스 자체의 인스턴스를 가져올 수 있습니다. 어디서나 동일한 인스턴스. 이것은 아마도 디자인 패턴에 익숙하지 않다면 이해하기가 더 쉬운 해결책 일 수 있지만 여전히 싱글 톤을 탐험 해 보는 것이 좋습니다. 데이터베이스 연결은 일반적인 사용 사례입니다. – quickshiftin