ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでシングルトン モードを実装する最も安全な方法

PHP_PHP チュートリアルでシングルトン モードを実装する最も安全な方法

WBOY
WBOYオリジナル
2016-07-13 10:28:16882ブラウズ

一般的に使用されるデザインパターンとして、シングルトンパターンが広く使用されています。では、シングルトンを設計する最良の方法は何でしょうか?

通常は次のように書きます。インターネットで見つかる例のほとんどは次のようなものです:

コードをコピーします コードは次のとおりです:

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

tru​​e

http://www.bkjia.com/PHPjc/802220.html


技術記事
一般的な設計パターンとしては、シングルトンパターンが広く使われています。では、シングルトンを設計する最良の方法は何でしょうか? 通常、私たちはこのように書きます。オンラインで見つかる例のほとんどは...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。