1

私はヘルパークラスを利用するWebアプリケーションに取り組んでいます。これらのクラスは、フォーム処理などのさまざまな操作に対する関数を保持します。

アプリケーションの複数の場所でこれらのクラスが必要になることがあります。現在の方法は、新しいオブジェクトを作成することです。変数を渡すことができません。これは大変な作業になります。

これにシングルトンクラスを使用することを考えていました。このようにして、一度に1つのインスタンスのみが実行されていると確信しています。

ただし、私の質問は、このパターンを使用する場合、すべてのオブジェクトに対してシングルトンクラスを作成すると、多くのコード複製が必要になることです。

代わりに、シングルトンクラスであるsuperHelperのスーパークラスを作成し、すべてのヘルパーにそれを拡張させることはできますか?

この種の設定は機能しますか、それとも別の方法がありますか?

そしてそれがうまくいくなら、誰かがそのようなsuperHelperクラスをコーディングする方法について何か提案がありますか?

君たちありがとう

4

4 に答える 4

0

変数を渡すことができません。これは大変な作業になります。

よろしいですか?人々は、依存関係を渡す努力を過大評価する傾向があります。コンストラクターでそれを行う場合、通常はかなり簡単に行うことができます。

とは言うものの、phpではさまざまな方法で共有機能をグローバルスコープに入れることができます。最も簡単なのは、グローバル関数を使用することです。例えば。どのクラスにも属していない関数。もう1つのオプションは、静的クラスメソッドを使用することです。これら2つは非常に似ています。それらの構文を除いて、それらは本質的に同じプロパティを持っています。少し緩い結合ソリューションは、具象クラスが拡張する(抽象)基本クラスにメソッドとして機能を配置することです。これにより、すべての子クラス間で機能が共有されます。

上記のソリューションに共通するのは、コンパイル時のカップリングがあることです。実行時に依存関係を変更することはできません。これにより、アプリケーションはかなり厳格になります。彼らの主な利点は、彼らが抱える複雑さのレベルが低いことです。

より緩く結合されたアプリケーションが必要な場合は、ハード依存関係を変数に置き換えて、間接的なレベルを与えることができます。簡単なのは、オブジェクトを作成し、これをアプリケーション全体でグローバルに共有することです。globalPHPでこれを行うには、シングルトンやグローバルスコープの変数など、いくつかの方法があります(これには、キーワードを使用するか、$GLOBALS配列を介してアクセスできます)。

グローバル変数はある程度の間接参照を提供しますが、アプリケーションのどの部分が相互に依存しているかを把握するのが非常に困難になるため、多くの複雑さをもたらす傾向があります。このため、経験豊富なプログラマーはそれらを避けることがよくあります。これは、変数に状態がある場合に特に当てはまります。共有オブジェクトがステートレスの場合、この問題はそれほど一般的ではありません。

グローバル変数の危険を回避する唯一の方法は、代わりにローカル変数を使用することです。例えば。依存関係を渡すため。これは少し面倒かもしれませんが、私の経験では、多くの場合、それが想定されているほど大きな問題ではありません。少なくとも、多くの場合、メリットが問題を上回ります。とはいえ、痛みを和らげるテクニックがあります。特に依存性注入コンテナは、すべての配線を自動的に処理する自動ファクトリです。ただし、独自のレベルの複雑さがありますが、大規模なアプリケーションの場合は、確かに優れたソリューションになる可能性があります。

于 2010-03-08T14:54:59.937 に答える
0

ファクトリパターンと依存性注入を調べます。

http://www.potstuck.com/2009/01/08/php-dependency-injection/

于 2010-03-08T17:15:24.107 に答える
0

シングルトンクラスを拡張することはできません。シングルトンクラスではコンストラクターをプライベートにするので、コンストラクターがプライベートの場合、このクラスをどのように拡張できますか?コンストラクターと呼ばれるクラスのオブジェクトを作成することは誰もが知っています。子クラスのコンストラクターでは、暗黙的に親コンストラクターと呼ばれます。したがって、このシナリオでは、子クラスでプライベートコンストラクターを呼び出すことはできません。

于 2013-04-29T12:02:07.513 に答える
-1

シングルトンは必要な場合もありますが、悪です(グローバルな状態であるため)。あなたがそれを助けることができるならば、それらを避けるようにしてください。

編集:シングルトンを回避できない場合は、少なくともその状態への参照をパラメーター化してください。つまり、クラスで、シングルトンをそのコンストラクターまたはシングルトンを使用するメソッドに渡します。

コードベース全体でシングルトンへの参照を作成するだけでは、クラスを個別にテストする能力が損なわれます。

シングルトンがステートフルである場合、テストは突然ステートフルになり、以前のテストの失敗によって前提条件が破損するため、テストは「カスケード失敗」を開始する可能性があります。

于 2010-03-08T13:28:36.560 に答える