可以将一个对象作为参数传递给构造函数中的另一个对象吗?

时间:2018-10-23 14:08:35

标签: php oop

我有2个类,其中一个女巫接收另一个对象作为参数。

$a = new A();
$b = new B($a);

现在出现了一种情况,需要从类A的构造函数中调用类B。

这可能吗?有一种方法可以做到这样

$b = new B($this);

在A类的构造函数中?

2 个答案:

答案 0 :(得分:2)

您可以将当前对象作为参数传递给另一个类。例如:

class A
{
    public function __construct()
    {
       $b = new B($this);
    }
}

class B
{
    public function __construct(A $a)
    {
        //some code
    }
}

但是,更好的方法是在A类中创建工厂方法,该方法将封装对象制作的逻辑。例如:

class A
{

    protected function makeB()
    {
        return new B($this);
    }

    public function __construct()
    {
       $b = $this->makeB();
    }
}

当然,正如@NigelRen所说,如果您想在其他地方使用这些类,则关闭链接是不好的做法。必须牢记这一点。

答案 1 :(得分:0)

是的,确实可以,但是请注意,您要执行的操作将导致递归。

int repetitions = 1000000000;

for (int i = 0; i < repetitions*10; i++) {
    Move move3 = new Move(2, 3);
    int sum3 = move3.x + move3.y;
}

// object block
long start = System.nanoTime();
for (int i = 0; i < repetitions; i++) {
    Move move2 = new Move(2, 3);
    int sum2 = move2.x + move2.y;
}
System.out.println("Object took " + (System.nanoTime() - start) + "ns");

// array block
long start2 = System.nanoTime();
for (int i = 0; i < repetitions; i++) {
    int[] move = new int[]{2, 3};
    int sum = move[0] + move[1];
}
System.out.println("Array took " + (System.nanoTime() - start2) + "ns");

哪个输出:

<?php

class A
{
    /** @var B $b */
    private $b;

    public function __construct()
    {
        $this->b = new B($this);
    }

    public function getB()
    {
        return $this->b;
    }
}

class B
{
    /** @var A $a */
    private $a;

    /** @var A $a */
    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

$a = new A();
$b = new B($a);

var_dump($a);
var_dump($a->getB());

在这里自己检查https://3v4l.org/36e9a