2

私が最善を尽くそうとしているのは、プログラム内の複数のオブジェクトをデータベースに接続することでした。

静的接続変数を使用してクラスを作成しました。これは、1つの接続のみが開かれ、すべてのオブジェクトがそれを共有することを意味しているようです。

class Database {
    public static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}

通常のオブジェクトバージョン。これにより、それを使用するオブジェクトごとに新しい接続が作成されます。

class Database {
    public $mysql;
    function __construct() {
        if (!isset($this->mysql)) {
            echo "Make connection\n";
            $this->mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if ($this->mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . $this->mysql->connect_error;
            }
            echo $this->mysql->host_info . "\n";
        }
    }

私は好ましいオプションが何であるか疑問に思いましたか?後でパフォーマンスの違いをテストする予定です。

4

1 に答える 1

0

データベースへの接続は非常にコストのかかる操作であるため、複数の接続を作成することは避ける必要があります。したがって、通常のオブジェクト バージョンを放棄する必要があります。

静的変数を使用するオプションは優れていますが、理想的ではありません。このコンストラクターをすべてのクラスにコピーすることについて覚えておく必要があります。そして、これに関連して何かを変更したい場合はどうしますか? 次に、すべてのクラスを開いて、どこでも変更する必要があります。

抽象オブジェクトを作成Databaseし、クラスで拡張する必要があると思います。

abstract class Database {
    protected static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}

そして、この接続を使用する新しいオブジェクトを作成するのは簡単です:

class ExtDatabase extends Database {
    public function __construct() {
        echo "Executing parent...";
        parent::__construct();
    }

    public function hostInfo() {
        //no problem with using connection there
        echo self::$mysql->host_info . "\n";
    }
}

しかし...それも優れたオプションではありません。より良い接続でシングルトンを使用し、データベースクラスを抽象化します。

于 2012-06-29T09:01:37.833 に答える