2017-11-11 16 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)의 사용과는 별도로 핵심 문제 중 하나는 [주기적 종속성] (https : //en.wikipedia.org/wiki/Circular_dependency). 즉,'B'없이'A'를 인스턴스화 할 수 없다는 것을 의미합니다. 그러나'A'없이'B'를 인스턴스화 할 수 없으므로 어느 클래스도 결코 인스턴스화 할 수 없습니다. – Sherif

답변

1

당신의 목표는 두 개체 사이에 앞뒤로 관계 많은 솔루션의 다음 한 당신이있을 때 백 레퍼런스를 제공하는 것입니다 경우

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 : 내가 선호를 $classA 대신 변수 $objA의 이름을 지정하는 것은 클래스가 아니기 때문에 클래스의 인스턴스이기 때문입니다.

NB2 : 참조가 작동하고 있음을 var_dump과 함께 보여줄 수 있도록 공개 변수로 선언했습니다.