Можно ли передать объект в качестве параметра другому объекту в конструкторе? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть 2 класса, один из которых получает объект другого в качестве параметра.

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

Теперь представлена ​​ситуация, которая потребует вызова класса B из конструктора класса A.

Это возможно?есть способ сделать что-то подобное

$b = new B($this);

в конструкторе класса A?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Да, это действительно возможно, но помните, что то, что вы хотите сделать, вызовет рекурсию.

<?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());

Какие выходные данные:

object(A)#1 (1) { ["b":"A":private]=> object(B)#2 (1) { ["a":"B":private]=> *RECURSION* } } 

object(B)#2 (1) { ["a":"B":private]=> object(A)#1 (1) { ["b":"A":private]=> *RECURSION* } }

Проверьте сами здесь https://3v4l.org/36e9a

0 голосов
/ 23 октября 2018

Вы можете передать текущий объект в качестве параметра другому классу.Например:

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, закрытые ссылки - плохая практика, если вы хотите использовать эти классы в других местах.Это нужно иметь в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...