2012-03-09 2 views
1

좋아, 이건 그냥 간단한 질문이며, 이것에 대한 약간의 여유가 있을지 모르지만 나는 완전히 독학으로 약간의 지침을 찾고 있습니다. 나는 많은 독서를하고 건물을 많이 짓려고 노력합니다 - 나는 PHP 나 mysql, 웹 지식의 전반적인 중급 단계에 접어 들었다고 말할 수 없습니다 - 결코 진보되지 않거나 과도하게 확신 할 수는 없습니다 - 여전히 배우기.PHP OOP 데이터베이스 디자인

저는 PHP에서 OOP를 다루려고 노력하고 있습니다. 그래서 저는 MySQL을위한 훌륭한 데이터베이스 래퍼를 만들고 싶습니다. MySQL을 가장 편안하게 사용할 수 있으며 다른 데이터베이스를 사용할 이유가 없습니다. Idon't는 디자인에서 이식의 어떤 종류이라도 만들고 싶어한다 - 나는 그것이 나의 데이터베이스에 특정한 것을 원한다. 그래서 나는 PDO를 사용하고 싶지 않다.

그래서 처음에는 지금 가지고있는 질문은 mysqli를 확장 한 클래스를 만들어야하고 기본 데이터베이스 클래스를 확장하는 데이터베이스 테이블에 대한 모델 클래스를 만들어야합니까? 그래서 class-> child = mysqli-> DbBase-> UsersModel? 이렇게하면 클래스 안에 $ 문이 많이 필요합니다. 그렇지 않습니까?

또는 mysqli 클래스를 인스턴스화하고 DbBase에 전달해야합니까?

+0

정말 mysqli를 사용하지 말 것을 적극 권장합니다. 인터페이스는 PDO에 비해 못생긴 사마귀가 많으며 PDO는 PHP의 * 표준 * 최신 db API와 멀리 떨어져 있습니다. –

답변

3

클래스 종류는 실세계 (또는 가상의 "사물")에있는 것들을 나타냅니다. 맞습니까? DB의 인스턴스는 해당 db에 대한 연결을 나타냅니다. 데이터베이스 연결과 공통된 모델이 있습니까? 그렇지 않아. 모델은 데이터 액세스에 데이터베이스 연결을 사용하지만 일종의 데이터베이스 연결이 아니므로 작성하려는 모델 클래스에 데이터베이스 클래스의 인스턴스를 포함 시키십시오.

에 대해 Mysqli < -> DBClass : DBClass를 사용하여 달성하려는 작업에 따라 달라집니다. Mysqli는 몇 가지 추가 기능을 포함하고 있습니까? 그렇지 않다면 상속을 사용하지 마십시오. 그렇지 않으면 을 사용합니다.


아주 기본적인 예는, 당신에게 아이디어를 제공합니다 : (이 실제로 액티브 패턴의 완료되지 확실히 간단하지만 버전)

abstract class DbTable { 
    /* An instance of your DBClass (=Database Connection), to be used if no 
    * other connection is specified. */ 
    protected static $_defaultDbAdapter = null; 

    /* The db connection to be used by this instance. */ 
    protected $_dbAdapter = null; 

    /* The name of the table in the database. */ 
    protected $_tableName = ''; 

    public static function setDefaultDbAdapter(DbClass $db) { 
     self::$_defaultDbAdapter = $db; 
    } 

    public function setDbAdapter(DbClass $db) { 
     $this->_dbAdapter = $db; 
    } 

    public function getDbAdapter() { 
     if (null === $this->_dbAdapter) { 
      $this->setDbAdapter(self::$_defaultDbAdapter); 
     } 
     return $this->_dbAdapter; 
    } 

    public function insert(array $data) { /*...*/ } 
    public function update(array $data, $where) { /*...*/ } 
    public function delete($where) { /*...*/ } 
    public function select($where) { /* may e.g. return an array of DbTableRow childclass instances */ } 

    // ... 
} 

class Users extend DbTable { 
    protected $_tableName = 'my_users_table'; 
} 

abstract class DbTableRow { 
    /* The row itself (may be not yet saved to the db!) */ 
    protected $_data = array(); 

    /* The row as it is in the database (to find differences, when calling save()). */ 
    protected $_cleanData = array(); 

    /* An instance of the table that this row belongs to. */ 
    protected $_table = null; 

    public function __construct(DbTable $table, array $data = array()) { /*...*/ } 
    public function save() { /* uses $this->_table->insert()/update() */ } 
    public function __get($key) { /*...*/ } 
    public function __set($key, $value) { /*...*/ } 
    // ... 
} 

class User extends DbTableRow { } 

사용법 :

// Make a new connection to the database 
$db = new DbClass('...'); // or whatever you name that class... 

// Set this connection to be the default connection 
DbTable::setDefaultDbAdapter($db); 

// Create a new user 
$users = new Users(); 
$user = new User($users); 
$user->email = '[email protected]'; 
$user->save(); 
+0

당신의 대답에 감사드립니다. 나는 지금까지 찾고 있었던 것이 '가장'라고 생각하지만, 당신의 모델 접근 방식을 따르지 않을 것입니다.-> save()와 같은 메소드를 쉽게 가질 수있는 데이터 액세스 객체에서 확장되는 클래스의 테이블을 모델링하는 것이 합리적이지 않습니까? – adavkay

+0

그것은 실제로 의미가 있습니다. 그러나 테이블 클래스는 테이블을 나타내며 데이터 액세스에 테이블을 사용하지만 실제로는 데이터 연결 유형이 아니기 때문에 데이터베이스 연결과도 다릅니다. Zend_Framework 구성 요소 Zend_Db 및 Zend_Db_Table을 살펴 보는 것이 좋습니다. 그리고 저는 이것을 어떻게 처리 할 것인가에 대한 해답을 제시 할 것입니다! – Niko

0

OOP로 작업 할 계획이라면, PDO를 MySQL 라이브러리의 가장 최신의 OO 구현물로 사용하는 것이 좋습니다. 필자는 PDO-MySQL이 MySQLi보다 덜 특이하다고 생각하지 않습니다.

어떤 경우이든 PHP 클래스를 확장해서는 안되며 데이터베이스 연결을 사용하는 객체를 클래스의 속성으로 유지해야합니다.

또한 이러한 경우에 실제로 유용한 싱글 톤 디자인 패턴을 살펴 봐야합니다. Move out mysql connection into another class

+0

좋아,이 소리 좋은데, 그게 옳은 방법이 될 것이라고 -> 내 DbBase 또는 모델 클래스 외부에서 데이터베이스 개체 인스턴스화 및 다음 __construct 같은 함수에 전달하고 다음 속성으로 저장 처음에 속성으로 __construct 내부에서 인스턴스화합니다. 어떤 차이가 있습니까? – adavkay

+0

그것은 당신이 당신의 애플리케이션을 어떻게 디자인하는지에 달려 있지만, 생성자 내부에서 데이터베이스 객체를 인스턴스화하는 것이 가장 좋다고 말하고 싶습니다. 특별히 당신이 싱글 톤을 원한다면. 그렇다면 db 로그인 정보 등을 다루지 않아도 어디서나 DB 연결의 인스턴스를 얻을 수 있습니다. –

+0

괜찮습니다. 책의 Profesional PHP Design Patterns에서도 좋은 섹션을 발견했습니다. 나는 사파리 서적을 온라인으로 가지고 있으므로 누구나 갖고 있다면 바로 여기있다. [link] (http://abc.safaribooksonline.com/book/programming/php/9780470496701) – adavkay

0

OOP를 배우고 싶다면 Zend Framework와 같은 PHP 프레임 워크를 배우고 소스 코드를 읽어야한다고 생각합니다. 나는 그들에게서 많은 것을 배웠다.

+0

네, 저를 도왔습니다. Yii 기본 클래스와 Yii 배우려고. – adavkay