1

これは私がしばらくの間苦労してきたことであり、私は一人ではないことを知っています. 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();作成するすべてのクラスのコンストラクターのようなものを呼び出さずに、どこからでもデータベースクエリを呼び出すことができます。

4

0 に答える 0