2017-11-11 273 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错误消息'允许的内存大小##### bytes exhausted'。

这是最好的解决方法是什么?任何帮助赞赏。

+2

改为使用依赖注入。 –

+0

这看起来像一个糟糕的设计,你正在建立如此多的依赖到类结构中,它注定会导致问题。 –

+1

除了使用[依赖注入](https://en.wikipedia.org/wiki/Dependency_injection)之外,正如@tereško所提到的,这里的关键问题之一是你有一个[循环依赖](https) ://en.wikipedia.org/wiki/Circular_dependency)。这意味着你不能在没有'B'的情况下实例化'''',但是你也不能''没有'A'的实例化,这意味着你永远不能实例化任何一个类。 – 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 

注:我喜欢来命名变量$objA而不是$classA,因为它们不是类,而是类的实例。

NB2:我将这些变量声明为公共成员,只能用var_dump来证明引用正在工作。

相关问题