1

나는 서로에 따라 두 가지 종류가 있습니다PHP 여드름 상호 의존성

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

를 그리고 이렇게 여드름을 통해 포장해야합니다

$c = new \Pimple(); 
$c['aService'] = function($c){ 
    return new A($c['bService']); 
} 
$c['bService'] = function($c){ 
    return new B($c['aService']); 
} 

을하지만 불행하게도 내가 자전거를 얻을 :

Fatal error: Maximum function nesting level of '100' reached, aborting! 

사이클없이이 상호 의존성에 도달 할 수있는 방법이 있습니까? 아니면 단방향 의존성 만 사용할 수 있습니까?

답변

1

이가 생각 나게 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 
관련 문제