クラスは、現実世界(または想像上の「物」)のものを表します。 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();
私は本当にあなたが 'mysqli'を使わないことを強く勧めます。そのインターフェイスはPDOに比べて醜い疣贅を多く持ち、PDOはPHPの*標準*近代的なdb APIに遠く離れています。 –