mysqliを拡張し、複数のクラスを使用します
-
30-09-2019 - |
質問
私はPHP OOPのものに初めてのものです。
クラスデータベースを作成し、そこから他のクラスに電話しようとしています。私はそれを正しい方法でやっていますか?
クラスデータベース:
class database extends mysqli {
private $classes = array();
public function __construct() {
parent::__construct('localhost', 'root', 'password', 'database');
if (mysqli_connect_error()) {
$this->error(mysqli_connect_errno(), mysqli_connect_error());
}
}
public function __call($class, $args) {
if (!isset($this->classes[$class])) {
$class = 'db_'.$class;
$this->classes[$class] = new $class();
}
return $this->classes[$class];
}
private function error($eNo, $eMsg) {
die ('MySQL error: ('.$eNo.': '.$eMsg);
}
}
クラスDB_USERS:
class db_users extends database {
public function test() {
echo 'foo';
}
}
そして、私はそれをどのように使用していますか
$db = new database();
$db->users()->test();
それは正しい方法ですか、それとも別の方法で行われるべきですか?
ありがとうございました。
解決
あなたはそれをそのようにすることができます、それは何も悪いことではありません(私はかなり頻繁に似たことをします)。私が提案する唯一のことは、ダイの代わりに例外を使用することです(そうすれば、エラーを安全に処理できます)...
protected function error($eNo, $eMsg, $extra = '') {
throw new Exception('MySQL error: ['.$eNo.'] '.$eMsg.': '.$extra);
}
さらに、クエリメソッドをオーバーロードすることをお勧めします
public function query($sql, $result_mode = MYSQLI_STORE_RESULT) {
$result = parent::query($sql, $result_mode);
if ($result === false) {
$this->error($this->errno, $this->errstr, $sql);
}
return $result;
}
また、$ DBオブジェクトのコピーをChildクラス内に保存することをお勧めします。それで:
class db_users extends database {
protected $db = null;
public function __construct(Database $db) {
$this->db = $db;
}
public function test() {
echo 'foo';
}
}
次に、__callで:
if (!isset($this->classes[$class])) {
$class = 'db_'.$class;
$this->classes[$class] = new $class($this);
}
他のヒント
クラスを作成するためのこの工場スタイルには何の問題もありません。私はそれに少し例外を取り入れます。
私の唯一の懸念は、サブクラスのデータベースを拡張することです。
だから私は次のように変更します:
public function __call($className, $args) {
if (!isset($this->classes[$class])) {
if(include_once('db_'.$class)) {
$class = 'db_'.$class;
$this->classes[$class] = new $class($this);
} else {
throw new Exception("Db class not found");
}
}
return $this->classes[$class];
}
およびユーザーのクラスとして:
public class db_users {
private $db;
public __constructor($db) {
$this->db = $db;
}
public function test() {
return 'Foo';
}
}
所属していません StackOverflow