一般的に使用されるデザインパターンとして、シングルトンパターンが広く使用されています。では、シングルトンを設計する最良の方法は何でしょうか?
通常は次のように書きます。インターネットで見つかる例のほとんどは次のようなものです:
コードをコピーします コードは次のとおりです:
class A
{
protected static $_instance = null;
protected function __construct( ;
self: :$_instance = new self();
return self::$_
$a = A::getInstance();
$b = B::getInstance();
var_dump($a === $b);
このクラスがプライベートにならないように、__construct メソッドをプライベートとして設定します。他のものはインスタンス化されます。しかし、この書き方の明らかな問題は、コードを再利用できないことです。たとえば、A を 1 つずつ継承します。
コードをコピーします。 コードは次のとおりです。
class B extends A
{
protected static $_instance = null;
}
$a = A::getInstance();
$b = B::getInstance();
var_dump($a === $b);
上記のコードは出力します:
コードをコピーします コードは次のとおりです:
bool(true)
問題は self にあります。つまり、A が B を継承しても、その自己参照は依然として を指します。 A.この問題を解決するために、PHP 5.3 では後期静的バインディング機能が導入されました。簡単に言えば、静的メソッドまたは変数は static キーワードを介してアクセスされます。self とは異なり、静的参照は実行時に決定されます。したがって、シングルトン モードを再利用できるようにコードを書き直すだけです。
コードをコピーします
コードは次のとおりです:
class C{ protected static $_instance = null; protected function __construct() {
}
protected function __clone()
{
//クローンを許可しない
}
public function getInstance() { if (static::$_instance === null) { static::$ _instance = new static; }
return static::$_instance;
);var_dump($c) === $d);
上記のコード出力:
コードをコピー
コードは次のとおりです:
bool(false)
このように、$_instance 変数を継承して再初期化するだけで、シングルトン パターンを実装できます。上記のメソッドは PHP 5.3 でのみ使用できることに注意してください。PHP の以前のバージョンでは、シングルトン クラスごとに getInstance() メソッドを作成することをお勧めします。
PHP のシングルトン モードには Java と同じスレッド セーフティの問題はありませんが、ステートフル クラスにシングルトン モードを使用する場合は注意が必要であることに注意してください。シングルトン モード クラスは、PHP 実行のライフサイクル全体に伴い、メモリのオーバーヘッドにもなります。
http://www.bkjia.com/PHPjc/802220.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/802220.html
技術記事
一般的な設計パターンとしては、シングルトンパターンが広く使われています。では、シングルトンを設計する最良の方法は何でしょうか? 通常、私たちはこのように書きます。オンラインで見つかる例のほとんどは...