이가 생각 나게 baboushka의 여기에 무한 재귀를 얻을되어있어 물론
. 두 함수는 서로를 호출 할 때마다 매번 새로운 인스턴스를 반환합니다.이 함수는 호출의 반환 값을 함수 카운터 부분에 전달합니다.이 함수는 함수를 다시 호출하여 다른 함수를 호출하고 다시 호출합니다.
최종선 : 출발에서 서로 의존하는 2 개의 클래스가있는 경우 디자인에 결함이있는 것 같습니다.
두 생성자를 모두 정의한 방식으로는 클래스의 인스턴스를 만들 수 없습니다. 동시에 두 클래스를 모두 인스턴스화해야하기 때문입니다.
당신은 할 수 없습니다, 당신은 단순히 수 없습니다 할.
이 시도 : BTW
$a = new A;
$b = new B($a);
//or even:
$bFromA = $a->b;
:
class A
{
public $b = null;
public function __construct(B $b = null)
{
$this->b = $b;
}
public function setB(B $b = null)
{
if ($b === null)
{
$b = new B($this);//pass A here
}
$this->b = $b;
return $this;
}
}
class B
{
public $a = null;
public function __construct(A $a = null)
{
$this->setA($a);
}
public function setA(A $a = null)
{
if ($a === null)
{
$a = new A($this);//pass B here
}
$this->a = $a;
return $this;
}
}
을 인스턴스를 전달 null
에 생성자 인자의 기본값을 설정함으로써 그래서 지금 당신은이 작업을 수행 할 수 선택이되었다 : 항상 귀하의 부동산을 신고하십시오. It'll speed up your classes.
개인적으로, 나는 게터 및 세터, 게으른 부하 종속성을 사용 싶지만, 같이 나는 생성자를 유지하는 것입니다 :
class A
{
//protected, or private. Access this via getter/setter
protected $b = null;
public function __construct(B $b = null)
{
$this->setB($b);
return $this;
}
//setter, allows injection later on
public function setB(B $b = null)
{
$this->b = $b;//allow to set to null
return $this;
}
//getter, lazy-loader:
public function getB()
{
if ($this->b === null)
{//create new instance, if b isn't set
$this->setB(
new B($this)
);
}
return $this->b;
}
}
class B
{
protected $a = null;
public function __construct(A $a = null)
{
$this->setA($a);
return $this;
}
public function setA(A $a = null)
{
$this->a = $a;
return $this;
}
public function getA()
{
if ($this->a === null)
{
$this->setA(
new A($this)
);
}
return $this->a;
}
}
하는 사용하여 여드름 :
$c['aService'] = function($c)
{
return new A;
};
$c['bService'] = function($c)
{
return new B;
};
$b = $c->bService;
$b->getA();//works just fine