当另一个类在构造函数中设置了另一个类时,在构造函数中实例化一个类

时间:2017-11-11 11:55:47

标签: php class oop constructor instantiation

当我想在另一个类中使用类的方法和属性时,我在构造函数中实例化这些类并将它们设置为实例属性。

<?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;。

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

1 个答案:

答案 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来证明引用是有效的。