PHP 単一要素設計パターンの原理と応用分析_PHP チュートリアル

WBOY
リリース: 2016-07-15 13:33:36
オリジナル
811 人が閲覧しました

一部のアプリケーション リソースは、このタイプのリソースが 1 つしかないため排他的です。たとえば、データベース ハンドルを介したデータベースへの接続は排他的です。アプリケーション全体でデータベース ハンドルを共有する必要があるのは、接続を開いたままにするか閉じたままにするときにオーバーヘッドが発生するためであり、単一ページをフェッチするプロセスではさらにオーバーヘッドがかかるからです。 PHP の単一要素設計パターンは、この要件を満たすことができます。アプリケーションに一度に 1 つのオブジェクトだけが含まれる場合、このオブジェクトはシングルトンです。リスト 1 のコードは、PHP V5 のデータベース接続シングルトンを示しています。

PHP 単一要素設計パターンのケース :

リスト 1. Singleton.php

<ol class="dp-xml">
<li class="alt"><span><strong><font color="#006699"><span class="tag"><!--SP--><span class="tag-name">php</span></span></font></strong><span> </span></span></li>
<li><span>require_once("DB.php");  </span></li>
<li class="alt"><span> </span></li>
<li><span>class DatabaseConnection  </span></li>
<li class="alt"><span>{  </span></li>
<li><span>public static function get()  </span></li>
<li class="alt"><span>{  </span></li>
<li>
<span>static $</span><span class="attribute"><font color="#ff0000">db</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">null</font></span><span>;  </span>
</li>
<li class="alt">
<span>if ( $</span><span class="attribute"><font color="#ff0000">db</font></span><span> == null )  </span>
</li>
<li>
<span>$</span><span class="attribute"><font color="#ff0000">db</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> DatabaseConnection();  </span>
</li>
<li class="alt"><span>return $db;  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>private $</span><span class="attribute"><font color="#ff0000">_handle</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">null</font></span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li><span>private function __construct()  </span></li>
<li class="alt"><span>{  </span></li>
<li>
<span>$</span><span class="attribute"><font color="#ff0000">dsn</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">'mysql://root:password@localhost/photos'</font></span><span>;  </span>
</li>
<li class="alt">
<span>$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">_handle</font></span><span> =& DB::Connect( $dsn, array() );  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li><span>public function handle()  </span></li>
<li class="alt"><span>{  </span></li>
<li>
<span>return $this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>_handle;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>print( "</span><span class="attribute"><font color="#ff0000">Handle</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">".DatabaseConnection::get()->handle()."</font></span><span>n" );  </span>
</li>
<li class="alt">
<span>print( "</span><span class="attribute"><font color="#ff0000">Handle</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">".DatabaseConnection::get()->handle()."</font></span><span>n" );  </span>
</li>
<li>
<span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span>
</li>
</ol>
ログイン後にコピー

このコードは、DatabaseConnection という名前の単一クラスを示しています。コンストラクターはプライベートであるため、独自の DatabaseConnection を作成することはできません。ただし、静的 get メソッドを使用すると、DatabaseConnection オブジェクトを 1 つだけ取得できます。最良の証拠は、handle メソッドによって返されるデータベース ハンドルが 2 つの呼び出し間で同じであることです。コマンドラインでコードを実行すると、これを確認できます。

<ol class="dp-xml">
<li class="alt"><span><span>% php singleton.php  </span></span></li>
<li>
<span class="attribute">Handle</span><span> = </span><span class="attribute-value">Object</span><span> id #3  </span>
</li>
<li class="alt">
<span class="attribute">Handle</span><span> = </span><span class="attribute-value">Object</span><span> id #3  </span>
</li>
<li><span>% </span></li>
</ol>
ログイン後にコピー

返された 2 つのハンドルは同じオブジェクトです。 PHP の単一要素設計パターンでアプリケーション全体でデータベース接続の単一要素を使用する場合、どこでも同じハンドルを再利用できます。グローバル変数を使用してデータベース ハンドルを保存できますが、このアプローチは小規模なアプリケーションにのみ適しています。大規模なアプリケーションでは、グローバル変数の使用を避け、オブジェクトとメソッドを使用してリソースにアクセスします。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446048.html技術記事一部のアプリケーション リソースは、このタイプのリソースが 1 つしかないため、排他的になります。たとえば、データベース ハンドルを介したデータベースへの接続は排他的です。アプリで共有したいと考えています...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!