8

私はCodeigniterに取り組んで数年になりますが、デザインパターンを確認したかっただけです。作業中のプロジェクトにさまざまなデザインパターンを実装して、これらをよりよく理解できるようにしたかったのです。

CodeigniterMVCパターンに従っていることは知っていますが、どのデザインパターンがcodeigniterに従っていますか?

database.phpと言えば、データベースクラスはシングルトンデザインパターンを実装していますか?私が認識している限り、シングルトンでは、グローバルアクセスを提供する単一のインスタンスが作成され、それがCIデータベース構成オブジェクトが行うことです。

4

1 に答える 1

6

はい、Codeigniter のローダーは現在、シングルトン パターンに従っているか、少なくともそれが最も正確に説明しているパターンです。以下を実行すると:

$this->load->library('foo');
$this->load->model('foo');
$this->load->database('foo');

ローダーは次のことを行います。

  • ロードしたクラスのレジストリをチェックして、ロードしているクラスが以前にロードされているかどうかを確認します。ロードされている場合は、デバッグ ログ エントリで要求を黙って無視します。

  • 設定したパラメーターを使用してクラスをインスタンス化し、クラスにちなんで名付けられたフレームワーク (シングルトンっぽい) スーパー オブジェクト内でそのオブジェクトへの参照を作成するか、任意のカスタム名を渡します。参照を保存し、その後のロードの試行を無視します。

ブートストラップでは、ローダー メソッドの背後にあるグローバル スコープの魔法の関数を使用して、DB やコア ライブラリなどを構築します。

より伝統的なシングルトン アプローチでは、次のようなことを行います (自動読み込みを使用)。

return $className::instance();

...インスタンスメソッドがインスタンスを返す場所、またはまだインスタンス化されていない場合は構築するため、ロードされているものとロードされていないものを追跡する必要がなくなります。クラスがロードされている場合は参照が渡され、ロードされていない場合は新しいオブジェクトが作成されて返されます。

技術的には、CI はこの点で独自のパターンですが、用語が正確に適用されるシングルトンに十分近いと思います。これは実際にはシングルトンであり、典型的な方法で実装されていません。

最後に、ローダをより柔軟にするCI-3用のパッチが浮かんでいることを確認しました。これにより、これらの場合にオブジェクトまたは参照を返すことで、スーパーオブジェクトの外部で好きなように作業できるようになりますが、 Ellis Labsがそれらを取っている状況。

于 2013-02-01T01:19:23.737 に答える