@runprogr

Как правильно инициализировать рекурсивные зависимости?

Внезапно столкнулся с проблемой, скрипт начал падать с ошибкой segmentation fault, не давая никаких подробностей.

Методом дедукции выяснил что проблема в следующем.

Class1
{
  private Class2 $class2;

    public function __construct()
    {
        $this->class2 = app(Class2::class);
    }
}
Class2
{
  private Class1 $class1;

    public function __construct()
    {
        $this->class1 = app(Class1::class);
    }
}


Класс1 в зависимости имеет Класс2
Класс2 в зависимости имеет Класс1
Что вызывает, видимо, бесконечную рекурсию и падение скрипта.

Вопрос - как правильно инициилизровать зависимости в таком случае ? (средствами laravel, или же в целом php)
На поверхности только вариант убирать зависимость из конструктора и создавать ее уже в конкретном методе. Таким образом пока метод запрошен не будет, зависимость создаваться не будет, рекурсия разорвется. Но есть ли вариант как то это сделать, не убирая из конструкторов классов ?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
Если получилась такая циклическая связь, скорее всего выбрана неудачная архитектура. Попробуйте решить задачу через третий класс как фасад над этими двумя.

class Class1
{
    public function doSomethingWithClass2Object(Class2 $obj2)
    {
    }
}
class Class2
{
    public function doSomethingWithClass1Object(Class1 $obj1)
    {
    }
}
class ClassFacade
{
    private Class1 $class1;
    private Class2 $class2;

    public function __construct()
    {
        $this->class1 = app(Class1::class);
        $this->class2 = app(Class2::class);
    }

    public function doSomething()
    {
    	$this->class1->doSomethingWithClass2Object($this->class2);
    	$this->class2->doSomethingWithClass1Object($this->class1);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы