当另一个类在构造函数中创建另一个类时,在构造函数中实例化一个类
问题描述:
当我想在另一个类中使用类的方法和属性时,我在构造函数中实例化这些类并将它们设置为实例属性。当另一个类在构造函数中创建另一个类时,在构造函数中实例化一个类
<?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'。
这是最好的解决方法是什么?任何帮助赞赏。
答
如果你的目标是有那么多的解决方案之一是提供了反向引用,当你拥有了它两个对象之间的背部和往复关系:
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
来证明引用正在工作。
改为使用依赖注入。 –
这看起来像一个糟糕的设计,你正在建立如此多的依赖到类结构中,它注定会导致问题。 –
除了使用[依赖注入](https://en.wikipedia.org/wiki/Dependency_injection)之外,正如@tereško所提到的,这里的关键问题之一是你有一个[循环依赖](https) ://en.wikipedia.org/wiki/Circular_dependency)。这意味着你不能在没有'B'的情况下实例化'''',但是你也不能''没有'A'的实例化,这意味着你永远不能实例化任何一个类。 – Sherif