デザイン パターンは Java アーキテクトのみが使用できるものであるという誤った考えを誰もが常に持っています。実際、デザイン パターンは誰にとっても非常に役立ちます。この記事を読んだ後は、間違いなく PHP の単一要素パターンを紹介します。
PHP 単一要素パターンのケース :
リスト 1. Singleton.php
<ol class="dp-xml"> <li class="alt"> <span><strong><font color="#006699"><span class="tag"><?</SPAN><SPAN class=tag-name>php</SPAN></FONT></STRONG><SPAN> </SPAN></SPAN><LI class=""><SPAN>require_once("DB.php"); </SPAN><LI class=alt><SPAN> </SPAN><LI class=""><SPAN>class DatabaseConnection </SPAN><LI class=alt><SPAN>{ </SPAN><LI class=""><SPAN>public static function get() </SPAN><LI class=alt><SPAN>{ </SPAN><LI class=""><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></SPAN><LI class=alt><SPAN>if ( $</SPAN><SPAN class=attribute><FONT color=#ff0000>db</FONT></SPAN><SPAN> == null ) </SPAN></SPAN><LI class=""><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></SPAN><LI class=alt><SPAN>return $db; </SPAN><LI class=""><SPAN>} </SPAN><LI class=alt><SPAN> </SPAN><LI class=""><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></SPAN><LI class=alt><SPAN> </SPAN><LI class=""><SPAN>private function __construct() </SPAN><LI class=alt><SPAN>{ </SPAN><LI class=""><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></SPAN><LI class=alt><SPAN>$this-</SPAN><SPAN class=tag><STRONG><FONT color=#006699>></span></font></strong></span><span class="attribute"><font color="#ff0000">_handle</font></span><span> =& DB::Connect( $dsn, array() ); </span> </li> <li class=""><span>} </span></li> <li class="alt"><span> </span></li> <li class=""><span>public function handle() </span></li> <li class="alt"><span>{ </span></li> <li class=""> <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 class=""><span>} </span></li> <li class="alt"><span> </span></li> <li class=""> <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 class=""> <span></span><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 class=""> <span></span><span class="attribute">Handle</span><span> = </span><span class="attribute-value">Object</span><span> id #3 </span> </li> <li class="alt"> <span></span><span class="attribute">Handle</span><span> = </span><span class="attribute-value">Object</span><span> id #3 </span> </li> <li class=""><span>% </span></li> </ol>
返された 2 つのハンドルは同じオブジェクトです。アプリケーション全体でデータベース接続の単一要素を使用すると、どこでも同じハンドルを再利用できます。グローバル変数を使用してデータベース ハンドルを保存できますが、このアプローチは小規模なアプリケーションにのみ適しています。大規模なアプリケーションでは、グローバル変数の使用を避け、オブジェクトとメソッドを使用してリソースにアクセスします。