これは私がしばらくの間苦労してきたことであり、私は一人ではないことを知っています. PHP クラスでデータベース接続を使用できるようにするための「ベスト プラクティス」の方法を探しています。静的関数とシングルトンについて読み始めたところです。私は現在、これが進むべき道だと思っていますが、私が言いたいことを知っていれば、新しいハンマーを購入した直後にすべての問題を釘と見なすことは避けたい. この質問をするのは私だけではないことはわかっていますが、その方法を説明している適切なリソースが見つかりません。
私が探していると思うのは、グローバル呼び出しを削除または最小化する再利用可能なクラスです。パフォーマンス上の理由から、クラスの複数のコピーを作成したり、複数のデータベース インスタンスを作成したりしたくないことはわかっています。
私が作成したと思うもの (いくつかの単語の定義については少しあいまいです) は、データベース シングルトンです。
私が探しているのは、アドバイスです。これは、データベース クラスを使用する「べき」方法ですか? もしそうなら、私はそれを最善の方法で書きましたか?
PHPは次のとおりです。
<?php
# set all errors and notices on.
error_reporting(E_ALL);
ini_set('display_errors', '1');
# database static class.
class database {
private static $connection;
private static $instance;
private function __construct(){
# run the connection here
self::$connection='*dbcon*';
echo 'connecting...<br />';
}
public static function getInstance(){
# this only runs once, calling the construct once.
if(!self::$instance){
self::$instance = new database();
}
return self::$instance;
}
private static function sanitise($data){
# sanitise data before it's sent to the database
return '~'.$data.'~';
# sanitisation is flagged by adding tildas to a string.
}
public function runquery($query){
echo 'running query...<br />';
return self::$connection.' - '.self::sanitise($query);
}
}
# user class
class myuser {
function getuser($username){
# this uses the database class, but shouldn't call a second copy of it.
# I should be able to re-use the connection string created outside this class.
# Doing so sould not trigger a reconnection (flagged by echoing 'connecting...')
echo database::runquery('SELECT * FROM user_tbl WHERE username='.$username);
# The above line will call everything I need to return a result including sanitisation.
}
}
# this line would be needed to substantiate an instance of the database.
database::getInstance();
# run two queries on the database to see if they both run from the same connection
echo database::runquery('test query');
echo '<br />';
echo database::runquery('second test query');
echo '<br />';
# substantiate a new user class
$user = new myuser();
# load in the current user.
$user->getuser('mark');
?>
結果は次のとおりです。
connecting...
running query...
*dbcon* - ~test query~
running query...
*dbcon* - ~second test query~
running query...
*dbcon* - ~SELECT * FROM user_tbl WHERE username=mark~
出力には「接続中...」の文字列が1つしかなく、$this->database = new database();
作成するすべてのクラスのコンストラクターのようなものを呼び出さずに、どこからでもデータベースクエリを呼び出すことができます。