2012-03-09 13 views
1

OK、これは簡単な質問ですが、私はこれに少し余裕がないかもしれませんが、私はちょっとした指導を探しています。私はたくさんの読書をして、たくさんのことをやろうとしています - 私はPHPやmysql、そしてWeb知識の素晴らしい中間段階に入ってきていると言っています - 決して高度でも過度にも自信がない - まだ学んでいる。PHP OOPデータベースデザイン

私は実際にPHPでOOPに取り組もうとしています。そのため、MySQL用のリーンデータベースラッパーを作成したいと思います.MySQLに最も慣れています。他のデータベースを使用する理由はありません。私はデザインに移植性を持たせたくないです。データベースに固有のものにしたいと思っています。だから私はPDOを使いたくない。

これまでの質問は、mysqliを拡張したクラスを作成し、そのベースデータベースクラスを拡張するデータベーステーブルのモデルクラスを作成する必要がありますか?だからclass-> child = mysqli-> DbBase-> UsersModel?これはクラス内にたくさんの$ thisステートメントを必要としますが、そうではありませんか?

また、mysqliクラスをインスタンス化してDbBaseに渡す必要がありますか?

+0

私は本当にあなたが 'mysqli'を使わないことを強く勧めます。そのインターフェイスはPDOに比べて醜い疣贅を多く持ち、PDOはPHPの*標準*近代的なdb APIに遠く離れています。 –

答えて

3

クラスは、現実世界(または想像上の「物」)のものを表します。 DBのインスタンスは、そのデータベースへの接続を表します。データベース接続と共通のモデルを持っていますか?あんまり。モデルデータベース接続を使用してデータにアクセスしますが、というデータベース接続の種類ではないため、モデルクラスにデータベースクラスのインスタンスを含めることをお勧めします。

Mysqliについて< - > DBClass:それはあなたがDBClassで達成しようとしていることに本当にかかっています - それはMysqliをいくつかの余分な機能などで拡張していますか?それがなければ、そこに継承を使用しないでください。さもなければ、を使用してください。


非常に基本的な例、ちょうどあなたのアイデアを与えるために:(それは実際にはActiveRecordパターンの完全な単純化されたが、間違いではないバージョンです)

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で作業する場合は、MySQLライブラリの最新のOO実装であるため、PDOの使用を強くお勧めします。私はPDO-MySQLがMySQLiよりもMySQL固有のものであるとは思わない。

いずれの場合でも、PHPのクラスを拡張するべきではありません。データベース接続を持つオブジェクトをクラスのプロパティとして保持する必要があります。

また、シングルトンのデザインパターンを調べる必要があります。これは、これらのケースでは本当に便利です。 Move out mysql connection into another class

+0

これはいいと思いますが、これは正しい方法でしょうか?→DbBaseやモデルクラスの外でデータベースオブジェクトをインスタンス化し、それを__constructなどの関数に渡してプロパティとして保存する最初にプロパティとして__constructの内部でインスタンス化することができます。違いはありますか? – adavkay

+0

これはアプリケーションの設計方法によって異なりますが、コンストラクタ内でデータベースオブジェクトをインスタンス化することをお勧めします。特にシングルトンを望む場合。その後、DBログイン情報などを扱わなくても、DB接続のインスタンスを得ることができます。 –

+0

大変感謝しています。プロフェッショナルなPHPデザインパターンの良いセクションも見つかりました。私はサファリの本をオンラインで持っているので、他の誰かがそれを持っているなら、ここにある:[リンク](http://abc.safaribooksonline.com/book/programming/php/9780470496701) – adavkay

0

もしあなたが本当にOOPを学びたいのであれば、(Zend Frameworkのような)いくつかのPHPフレームワークを学び始め、ソースコードを読むべきであると思います。私は彼らからたくさんのことを学びました。

+0

そう、それは私を助けてくれている。 Yiiの基本クラスとYiiを学ぼうとしています。 – adavkay