1

php.net の mysql-connect ページで db アダプターを見つけました。
これは非常に多く閲覧されているページです (私は想像します)。

これには、著者がシングルトン パターン クラスであると主張するものが含まれます。

http://php.net/manual/en/function.mysql-connect.php にあります

作家は次のように述べています。

「これは、単一のデータベース接続を管理するシングルトン クラスです。Open メソッドは、定数値をデフォルトとして使用し、各 Web ページの上部にロードされた初期化スクリプトを介して ini ファイルから読み取ります。手動でown (スクリプトの途中でサーバーまたはデータベース名を切り替える必要がある場合) qry 関数は、準備されたステートメントを受け取り、最初の行、最初の連想行、最初のセル、または 2 番目のパラメーターに基づいて結果セット全体 (結果全体) を返します。省略した場合)」。

使用法: $DB = DB::Open();
$result = $DB->qry(" {SQL ステートメント} ;");

<?php
    abstract class Database_Object
    {
        protected static $DB_Name;
        protected static $DB_Open;
        protected static $DB_Conn;

        protected function __construct($database, $hostname, $hostport, $username, $password)
        {
            self::$DB_Name = $database;
            self::$DB_Conn = mysql_connect($hostname . ":" . $hostport, $username, $password);
            if (!self::$DB_Conn) { die('Critical Stop Error: Database Error<br />' . mysql_error()); }
            mysql_select_db(self::$DB_Name, self::$DB_Conn);
        }

        private function __clone() {}

        public function __destruct()
        {
//            mysql_close(self::$DB_Conn);  <-- commented out due to current shared-link close 'feature'.  If left in, causes a warning that this is not a valid link resource.
        }
    }

    final class DB extends Database_Object
    {
        public static function Open($database = DB_NAME, $hostname = DB_HOST, $hostport = DB_PORT, $username = DB_USER,$password = DB_PASS)
        {
            if (!self::$DB_Open)
            {
                self::$DB_Open = new self($database, $hostname, $hostport, $username, $password);
            }
            else
            {
                self::$DB_Open = null;
                self::$DB_Open = new self($database, $hostname, $hostport, $username, $password);
            }
            return self::$DB_Open;
        }

        public function qry($sql, $return_format = 0)
        {
            $query = mysql_query($sql, self::$DB_Conn) OR die(mysql_error());
            switch ($return_format)
            {
                case 1:
                    $query = mysql_fetch_row($query);
                    return $query;
                    break;
                case 2:
                    $query = mysql_fetch_array($query);
                    return $query;
                    break;
                case 3:
                    $query = mysql_fetch_row($query);
                    $query = $query[0];
                    return $query;
                default:
                    return $query;
            }
        }
    }
?>

コードを見た後、1 つ質問があります。これは本当にシングルトンですか (DB クラスと Open 関数を参照)。

シングルトンパターンを機能させる静的プロパティはどうですか?

4

1 に答える 1

1

DOESが存在する場合、self::$DB_Openそれをnullに設定し、とにかくオブジェクトの新しいインスタンスを作成します。

あなたが正しいように見えますが、これはシングルトンパターンのようには見えません。

静的プロパティを持つシングルトン パターンについて。オブジェクト スコープにあるインスタンス変数とは異なり、静的変数はクラス スコープにあります。
これが意味することは、オブジェクトを複数回作成しても、静的プロパティには毎回同じ値が使用されるということです。それが、それらがカウンター、つまりグローバルなシングルトンに最適であることを可能にします。

以下を参照してください。

Class A {
static int y=1;
int x=3;
}
$newA = new A();
$newB = new A();
$newC = new A();

上記は x の 3 つのインスタンスを作成します。1 つのインスタンスで変更を行うことができ、その 1 つのインスタンスでのみ変更が行われます。
ただし、y のインスタンスは 1 つしか作成されません。したがって、1 を変更すると 3 つすべてが変更されます。それらはすべて同じコンテキストに存在します。したがって、同じ値を指します。1つをインクリメントすると、他のものも同じインクリメントを表示します..

繰り返しますが、 のインスタンスが 1 つしかDB_Conn存在しない場合でも、継続的にリセットして再度書き込みます (このように動作する必要はありません)。

問題を解決するために、作成者はself::$DB_Openプロパティが存在する場合はそれを返すことができます。

于 2013-02-04T12:50:39.140 に答える