$db =& DBConnection:: getInstance( );
// オブジェクトのユーザー プロパティを設定します
$db->user = 'sa';
// 2 番目の変数 (同じインスタンスを指す) を設定します
$sec =& DBConnection::getInstance();
/ / 'sa' を出力する必要があります
echo $second->user;
Class DBConnection {
var $user;
function &getInstance() {
static $me;
if (is_object($me) == true) {
$me を返す;
$me; }
}
?>
上記の例の最も重要な部分は、関数 getInstance() です。この関数は、静的変数 $me を使用して DBConnection クラスのインスタンスが 1 つだけ存在することを確認して、このクラスのインスタンスを返します。
シングルトンを使用する利点は、オブジェクトを明示的に渡す必要がなく、次のように getInstance() メソッドを使用するだけでオブジェクトを取得できることです:
コードをコピーします
コードは次のとおりです:
function test() {
$db = DBConnection::getInstance();
// オブジェクトを使って何かをします
}
?>しかし、欠点もいくつかありますシングルトンを使用する場合。まず、クラス内の複数のオブジェクトをグローバル化する必要がある場合はどうすればよいでしょうか?シングルトンを使用しているため、これは不可能です(名前がシングルトンであるため)。もう 1 つの問題は、シングルトンを個別のテストを使用してテストできないことです。スタック全体を導入しない限り、これは完全に不可能です。これは明らかに見たくないことです。これが、シングルトンが理想的なソリューションではない主な理由です。
登録パターン
コード内のすべてのコンポーネント (翻訳者注: グローバル オブジェクトまたはデータ) で一部のオブジェクトを利用できるようにする最良の方法は、中央のコンテナ オブジェクトを使用してすべてのオブジェクトを含めることです。通常、このコンテナ オブジェクトはレジストラと呼ばれます。非常に柔軟で非常にシンプルです。単純なレジストラ オブジェクトは次のようになります:
コードをコピーします
コードは次のとおりです:
Class Registry {
var $_objects = array(); function set($name, & $object) {
use using using using through ;
登録オブジェクトを使用する最初のステップは、set() メソッドを使用してオブジェクトを登録することです:
コードをコピーします コードは次のとおりです:
$db = new DBConnection ;
$settings = 新しい Settings_XML;
$user = 新しいユーザー;
// オブジェクトを登録します
$registry =& 新しいレジストリ;
$registry->set ('db', $db);
$registry-> set ('settings', $settings);
$registry->set ('user', $user);
?>
register オブジェクトにすべてのオブジェクトが保持されたので、この register オブジェクトを渡す必要があります(3 つのオブジェクトを別々に渡すのではなく) 関数に追加します。以下の例を見てください:
コードをコピーします コードは次のとおりです:
function test(&$registry) {
$db =& $registry->get(' db');
$settings =& $registry->get('settings');
$user =& $registry->get('user');
// オブジェクトを使って何かをします
}
? >
他のメソッドと比較して、レジスタの大きな改善点は、コードに新しいオブジェクトを追加する必要があるときに、すべてを変更する必要がなくなったことです (翻訳者注: コードを使用するプログラム内のすべてを指します)グローバル オブジェクトの) の場合、レジスタに新しいオブジェクトを登録するだけでよく、その後、そのオブジェクト (翻訳者注: 新しく登録されたオブジェクト) をすべてのコンポーネントですぐに呼び出すことができます。
レジスタを使いやすくするために、レジスタの呼び出しをシングルトン モードに変更しました (翻訳者注: 上記の関数転送は使用しないでください)。プログラム内で使用する必要があるのはレジスター 1 つだけであるため、シングルトン パターンはこのタスクに非常に適しています。次のように register クラスに新しいメソッドを追加します:
コードをコピーします コードは次のとおりです:
function &getInstance() {
static $me;
if (is_object($me) ) == true) {
「」""""" """"
コードをコピーします
コードは次のとおりです:
$db = new DBConnection;
$settings = new Settings_XML;
$user = new User;
// オブジェクトを登録します$registry =& Registry::getInstance ();$registry->set ('db', $db);$registry-> set ('settings', $settings);$registry->set ('user', $user) ;
function test() {
$registry =& Registry::getInstance();
$db =& $ registry->get('db');
$settings =& $registry->get('settings ');
$user =& $registry->get('user');
// 何かをするオブジェクトを使用して
}
?>
ご覧のとおり、プライベートなものを置く必要はありません。すべてが関数に渡され、「global」キーワードを使用する必要はありません。したがって、レジストラ パターンはこの問題に対する理想的な解決策であり、非常に柔軟です。
リクエストラッパー
レジストラは「global」キーワードを完全に冗長にしましたが、コードには依然として 1 種類のグローバル変数が存在します。それは、変数 $_POST、$_GET などのスーパー グローバル変数です。これらの変数は非常に標準的なものであり、問題なく動作するはずですが、場合によっては、レジスタを使用して変数をカプセル化する必要がある場合もあります。
簡単な解決策は、これらの変数を取得するためのインターフェイスを提供するクラスを作成することです。これはよく「リクエスト ラッパー」と呼ばれます。簡単な例を次に示します。
コードをコピーします。 コードは次のとおりです。
Class Request {
var $_request = array() ; 関数 Request() {
‐ ‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ?> ;
上記の例は単純なデモンストレーションです。もちろん、リクエスト ラッパーでは他の多くのこと (データの自動フィルタリング、デフォルト値の提供など) を行うことができます。
次のコードは、リクエスト ラッパーを呼び出す方法を示しています:
コードをコピー コードは次のとおりです:
$request = new Request;
// Register object
$registry =&レジストリ: :getInstance();
$registry->set ('request', &$request);
test();
function test() {
$registry =& Registry::getInstance();
$request =& $registry->get ('request');
// 'name' クエリ文字列を出力します。通常は $_GET['name'] になります
echo htmlentities($request->get('name' )) ;
}
?>
ご覧のとおり、現在はグローバル変数に依存しなくなり、これらの関数をグローバル変数から完全に遠ざけています。
結論
この記事では、コードからグローバル変数を根本的に削除し、それらを適切な関数と変数に置き換える方法を説明しました。登録パターンは、非常に柔軟性があり、コードが混乱するのを防ぐため、私のお気に入りのデザイン パターンの 1 つです。
また、レジストラ オブジェクトを渡すには、シングルトン パターンの代わりに関数パラメーターを使用することをお勧めします。シングルトンを使用する方が簡単ですが、後で問題が発生する可能性があり、関数のパラメーターを渡すことも理解しやすいです。
http://www.bkjia.com/PHPjc/327793.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/327793.html技術記事はじめに 新しい大規模な PHP プログラムを開発する場合でも、コードのさまざまな部分を使用するために一部のデータが必要になるため、必然的にグローバル データを使用することになります。一般的な全体像...
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。