0

簡単な説明

私は現在、親 (基本クラス) の多くの拡張機能を含む Web アプリケーションを構築しています。次の構造によく似ています。

Class A // Base Class
    -> Class B // Extension
    -> Class C // Extension
    // etc

拡張機能は、サイトのその領域に固有の機能を保持するため、たとえば、私のサイトの「ドキュメント」セクションには独自のクラス (基本クラスの拡張) があり、このクラスには関連するすべての機能が含まれます。ドキュメントを開く、編集する、削除するなど...

ただし、私のアプリケーションのメイン ナビゲーション メニューには、これらの「拡張」クラスのいくつかのメソッドによって収集された情報を表示するインタラクティブなドロップダウンがあります。

私の質問

現在、ナビゲーション メニューのデータを収集するために必要なすべてのメソッドにアクセスするには、次のようにいくつかの拡張クラスのインスタンスを作成する必要があります。

require_once(class.a.php);
require_once(class.b.php);
require_once(class.c.php);

// Create an instance of Class B to get the data for the first dropdown
$b = new B();

// Gather the data for the first dropdown
$dropdown[0] = $b->get_document_data();

// Create an instance of Class C to get the data for the second dropdown
$c = new C();

// Gather the data for the second dropdown
$dropdown[1] = $c->get_settings_statistics();

オブジェクトの新しいインスタンスを作成することは正確には「世界の終わり」ではありませんが、親クラスの構成関数は非常に大きいため、ページごとに複数のインスタンスを作成したくありません...

結果として、必要なメソッドを親クラスに配置するという別のオプションしか表示されません...私のクラスの動作を考えると、これはあまり実用的ではありません!

したがって、私が知りたいのは、オブジェクトのインスタンスを作成し、それに対して個別の拡張機能を個別にロードできるかどうかです。

または、これを達成するためのより良い方法を考えることができる場合は、お気軽に意見をお寄せください...

4

2 に答える 2

0

継承よりも構成を優先することができます:

 class A {
     public function __construct(){ /* heavy lifting here */ }

     public function coolSharedMethod(){}
 }

 class B {
     protected $a;
     public function __construct(A $myA){
          $this->a = $myA;
     }

     // proxy methods through
     public function coolSharedMethod(){
          return $this->a->coolSharedMethod();
     }
 }

A の初期化は同じですが、ケースバイケースで変更する必要がある状態が含まれている場合は、プロトタイプの設計パターンを調べることができます。

 $a = new A();
 $b = new B(clone $a);
 $c = new C(clone $a);
于 2013-05-28T19:02:54.137 に答える