ホームページ  >  記事  >  バックエンド開発  >  役に立たないPHPシングルトンモードアプリケーションを詳しく解説_PHPチュートリアル

役に立たないPHPシングルトンモードアプリケーションを詳しく解説_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:09:23875ブラウズ

シングルトン パターンには 3 つの主要なポイントがあります:
まず、クラスはインスタンスを 1 つだけ持つことができます。
第 2 に、このインスタンスを独自に作成する必要があります。
第三に、このインスタンスを独自にシステム全体に提供する必要があります。

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

/* シングルトンモードの例、重要なポイントは次のとおりです:
*
* 1. $_instance を宣言する必要があります。静的プライベート変数として
* 2. コンストラクターとクローン関数はプライベートとして宣言する必要があります。これは、外部プログラムが新しいクラスを作成してシングルトン モードの意味を失うことを防ぐためです。 public として宣言され、一意のインスタンスを返すにはこのメソッドを呼び出す必要があります
* 4. :: 演算子は静的変数または静的関数にのみアクセスできます
* 5. PHP の解釈と実行のため、PHP のシングルトン モードは相対的です。このメカニズムにより、各 PHP ページが解釈および実行され、関連するすべてのリソースがリサイクルされます。

* つまり、PHP には言語レベルでオブジェクトをメモリに常駐させる方法がありません。 PHP では、グローバル変数、
*、またはクラスの静的メンバーのいずれであっても、すべての変数はページ レベルであり、その結果、新しいオブジェクトが再確立され、完全に失われます。シングルトンの意味。
* ただし、実際のアプリケーションでは、同じページに複数のビジネス ロジックが存在する場合があります。このとき、シングルトン モードは非常に重要な役割を果たし、重複を効果的に回避します
* 新しいオブジェクト (注: 新しいオブジェクトはメモリ リソースを消費します)。したがって、PHP のシングルトン モードは相対的に言えば
*
*/
class People
{
static private $_instance = NULL;
public $age = ''; __construct()
{
$this->身長 = '185';
$this->年齢 = 25;
}
プライベート関数 __clone()
{
//何かをする
}
static public function getInstance( )
{
if(!self::$_instance instanceof self)
{
//echo 'lgh-big';
self::$_instance = 新しい self
}
else
{
// テスト専用
//echo 'gdc-xiaoairener';
}
return self::$_instance;
public function getHeight()
{
echo $this->height
}
public function getAge ()
echo; $this->age;
}
}
function testInstance()
{
People::getInstance()->getAge();
// クラスの使用を開始します
$ lgh = People::getInstance ();
$lgh->getHeight();
echo '
';
?>



利点:

新しい操作の数。新しい操作のたびにメモリ リソースとシステム リソースが消費されるためです

欠点:
PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページレベルになります。実行すると、新しいオブジェクトが再確立され、ページが実行された後にクリアされます。PHP シングルトン モードは意味がないようなので、PHP シングルトン モードは単一のページ レベルのリクエストのみに使用されると思います。複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合に、非常に意味があります。
理由 – なぜ PHP シングルトン パターンを使用するのですか? PHP の主要なアプリケーション シナリオの 1 つは、アプリケーションがデータベースを処理するアプリケーション シナリオです。そのため、データベース ハンドルを介してデータベースに接続する動作など、アプリケーション内で多数のデータベース操作が行われます。シングルトン モードを使用すると、新しい操作のたびにメモリ リソースとシステム リソースが消費されるため、大量の新しい操作を回避できます。 コードスニペットを示すので、まだ少し抽象的です。
従来の方法を使用したコーディング

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

...
//データベースハンドルを初期化します
$db = new DB(...);
//たとえば、ユーザー情報を追加するアプリケーションシナリオがあります:
$ db- >addUserInfo();
...
//ただし、このシナリオは関数内で必要になる場合があります。 this Do
...
function test(){
...
//この時点で、このコードが複数のアプリケーションのシナリオでどれほどひどいかを想像してみてください。 !
$db = new DB(...);
$db->getUserInfo();
...
//一部の友人は、これを行う必要はなく、グローバルを使用するだけだと言うかもしれません。キーワードは十分ですか?確かに、グローバルは問題を解決することができ、シングルトン モードの役割も果たします。ただし、グローバルはセキュリティ上のリスクがあるため、このようなコードを書くことは拒否されます。同時に、シングルトン モードはまさにその一種です。ユニークなインスタンスを格納するグローバル変数が名前空間を汚染しないように改良されました
global $db; //OOP では、このようなコードを書くことは推奨されません
...
}

シングルトン モードのコーディングを使用します
コードをコピーします コードは次のとおりです:

......
//すべてのアプリケーション シナリオに対してデータベース ハンドル リソースは 1 つだけあり、効率は非常に高いです。
// リソースも大幅に改善されました。保存すると、コードは簡潔かつ明確になります :)
DB::getInstance()->getUserInfo();シングルトンパターン?


シングルトン モードのアプリケーション シナリオを理解した後、シングルトン モードの具体的な実装コードを記述して、PHP シングルトン モードの核心点をマスターしましょう。コードは次のとおりです。

コードをコピーします。コードは次のとおりです:
/**
* PHP シングルトン モードのデモ例 * @author guohua.li * @modify 2010-07-11* @website http://blog.163.com/lgh_2002/*/
class User{
/**
* 静的完了変数はグローバルインスタンスを保存します
* @access private
*/
static private $_instance = NULL;
/**
* 外部オブジェクトがオブジェクトをインスタンス化するのを防ぐためのプライベート コンストラクター
* /
プライベート関数 __construct( ) {}
/**
* 外部オブジェクトの複製を防ぐプライベートクローン機能
*/
プライベート関数 __clone(){}
/**
* 静的メソッド、シングルトン統合アクセス入口
* @return object オブジェクトの唯一のインスタンスを返します
*/
静的パブリック関数 getInstance() {
if (is_null(self: :$_instance) || !isset(self::$_instance)) {
self::$_instance = 新しい self();
}
return self::$_instance;
}
/**
*テスト方法: ユーザー名を取得します
*/
public function getName() {
echo 'hello liguohua!';
}
}


上記のコードから、PHP シングルトン モードの実装に関する次の 3 つの主要なポイントを要約します:
1. クラスの唯一のインスタンス (通常は $_instance プライベート変数) を保存するには、静的メンバー変数が必要です。コンストラクター また、クローン関数はプライベートとして宣言する必要があります。これは、外部プログラムが新しいクラスを使用してシングルトン モードの意味を失わないようにするためです。


PHP シングルトン モードの欠点
ご存知のとおり、PHP 言語はインタープリタ型スクリプト言語であり、この動作メカニズムにより、各 PHP ページが解釈された後にすべての関連リソースがリサイクルされます。実行されました。言い換えれば、PHP には言語レベルでオブジェクトをメモリに常駐させる方法がありません。これは、たとえば Java では、ライフサイクル全体を通じて常に存在します。変数はページ間レベルであり、アプリケーションのライフサイクル内でこのインスタンスを真に一意にすることができます。ただし、PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページ レベルであり、ページが実行されるたびに新しいオブジェクトが再確立され、ページの実行後にクリアされます。 PHP のシングルトン モードは意味がないようなので、単一のページ レベルのリクエストで複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合にのみ、PHP シングルトン モードが非常に意味があると思います。

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

tru​​ehttp://www.bkjia.com/PHPjc/327290.html技術記事シングルトン パターンの主なポイントは 3 つあります。1 つ目は、クラスがインスタンスを 1 つだけ持つことができること、2 つ目は、このインスタンスを独自に作成する必要があること、3 つ目は、このインスタンスを独自にシステム全体に提供する必要があることです。 コードをコピー...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。