当我想在另一个类中使用类的方法和属性时,我在构造函数中实例化这些类并将它们设置为实例属性。
<?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错误消息,并且#39;允许的内存大小#####字节耗尽&#39;。
最好的解决方法是什么?任何帮助表示赞赏。
答案 0 :(得分: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
来证明引用是有效的。