PHP で API を構築していますが、質問があります。クラスを使用していますが、これらのクラスのいくつかはデータベースにアクセスする必要があります。ただし、データベースを開くためにすべてのクラスでデータベースの変数を定義したり、mysqli オブジェクトをすべてのクラス コンストラクターのパラメーターとして送信したりする必要はありません。
これについて最善の方法は何ですか?ある種のグローバル変数を定義しますか?
静的クラスを使用するのはどうですか?
class mysqli_wrapper {
private static $db = null;
public static function open() {
GLOBAL $opts; // this can be global or setup in other ways
if (!self::$db) {
self::close();
self::$db = null;
}
self::$db = @mysqli_connect('p:'.$opts['hn'], $opts['un'], $opts['pw'], $opts['db']);
return self::$db;
}
public static function query($qry) {
return mysqli_query ( self::$db, $qry );
}
public static function affected_rows() { return @mysqli_affected_rows(self::$db); }
public static function error() { return @mysqli_error(self::$db); }
public static function close() { @mysqli_close(self::$db); }
} // end mysqli_wrapper
mysqli_wrapper::open(); // Here's how to call it
私が維持しているシステムでは、アプリが独自の MySQL データベース、およびリモートの Oracle および SQL Server データベースにアクセスする必要があり、そのためにトレイトを使用しています。これは、MySQL を使用したコードの簡略化です。
dbaccess.php
trait DatabaseAccess {
protected $db;
private $host = 'host', $dbName = 'db', $username = 'username', $password = 'pword';
public function connectToMysql() {
$this->db= new mysqli(......);
}
}
次にmyclass.phpで
require 'dbaccess.php';
class MyClass {
use DatabaseAccess;
//class code.....
}
DatabaseAccess のすべての要素は、MyClass で手動で入力したかのように使用できます。注: PHP < 5.4 を使用している場合、この解決策は不可能です。