2017-11-11 18 views
0

クラスのメソッドとプロパティを別のクラスで使用する場合、これらのクラスをコンストラクタでインスタンス化し、インスタンスプロパティとして設定します。他のクラスがコンストラクタ内の他のクラスを起動したときにコンストラクタのクラスをインスタンス化する

<?php 
class ClassA 
{ 
    private $classB; 
    private $classC; 

    public function __construct() 
    { 
     // Instantiate class B and C and set the instance properties 
     $this->classB = new ClassB(); 
     $this->classC = new ClassC(); 
    } 

    // Example 
    public function getTest() 
    { 
     if ($this->classB->isTest1()) { 
      return 'some value'; 

     } elseif ($this->classC->isTest1()) { 
      return 'some other value'; 

     } else { 
      return 'some other value'; 
     } 
    } 
} 

$ClassA = new ClassA(); 
$test = $ClassA->getTest(); 

あり、私はコンストラクタでクラスをインスタンス化したいいくつかの時間があり、そして他のクラスには、コンストラクタあまりにも他のクラスをインスタンス化しています

<?php 

    class ClassA 
    { 
     private $classB; 

     public function __construct() 
     { 
      // Instantiate class B and set classB instance propert. 
      $this->classB = new ClassB(); 
     } 
    } 

    class ClassB 
    { 
     private $classA; 

     public function __construct() 
     { 
      // Instantiate class A and set classA property so we can use class A methods and properties in this class. 
      $this->classA = new ClassA(); 
     } 
    } 

    $ClassA = new ClassA(); 
    $ClassB = new ClassB(); 

これはクラスAためにかかわらず失敗します。コンストラクタでクラスBをインスタンス化し、クラスBはコンストラクタでクラスAをインスタンス化し、PHPエラーメッセージ「#####バイトのメモリサイズを使い果たした」が得られるまでこれをやり続けます。

これにはどのような最善の回避策がありますか?どんな助けもありがたい。その後、

+2

代わりに依存性注入を使用してください。 –

+0

これは悪いデザインのように見えますが、あなたはクラス構造に非常に多くの依存関係を構築しており、問題を引き起こすことになります。 –

+1

@tereškoで既に述べたように、[dependency injection](https://en.wikipedia.org/wiki/Dependency_injection)の使用以外にも、重要な問題の1つは、[循環依存](https ://en.wikipedia.org/wiki/Circular_dependency)。つまり、 'B'なしで' A'をインスタンス化することはできませんが、 'A'なしで' B'をインスタンス化することはできません。つまり、どちらのクラスもインスタンス化できません。 – Sherif

答えて

1

あなたの目的は2つのオブジェクト間の前後関係を持っているのであれば、多くの解決策の一つは、あなたがそれを持っているときの後方参照を提供することです:

class ClassA { 
    public $objB; 

    public function __construct($other = null) { 
     $this->objB = $other ? $other : new ClassB($this); 
    } 
} 

class ClassB { 
    public $objA; 

    public function __construct($other = null) { 
     $this->objA = $other ? $other : new ClassA($this); 
    } 
} 

$objA = new ClassA(); 
var_dump($objA->objB->objA === $objA); // true 

はNB:私は好みます変数$objAの名前を$classAの代わりに指定します。これらはクラスではなくクラスのインスタンスです。

NB2:参照が機能していることをvar_dumpで実証できるように、これらの変数を公開メンバーとして宣言しました。

関連する問題