クラスのメソッドとプロパティを別のクラスで使用する場合、これらのクラスをコンストラクタでインスタンス化し、インスタンスプロパティとして設定します。他のクラスがコンストラクタ内の他のクラスを起動したときにコンストラクタのクラスをインスタンス化する
<?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エラーメッセージ「#####バイトのメモリサイズを使い果たした」が得られるまでこれをやり続けます。
これにはどのような最善の回避策がありますか?どんな助けもありがたい。その後、
代わりに依存性注入を使用してください。 –
これは悪いデザインのように見えますが、あなたはクラス構造に非常に多くの依存関係を構築しており、問題を引き起こすことになります。 –
@tereškoで既に述べたように、[dependency injection](https://en.wikipedia.org/wiki/Dependency_injection)の使用以外にも、重要な問題の1つは、[循環依存](https ://en.wikipedia.org/wiki/Circular_dependency)。つまり、 'B'なしで' A'をインスタンス化することはできませんが、 'A'なしで' B'をインスタンス化することはできません。つまり、どちらのクラスもインスタンス化できません。 – Sherif