Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Обнаружение бесконечной рекурсии зависимостей

❓ Что такое бесконечная рекурсия зависимостей?

Это ситуация, когда зависимости циклически ссылаются друг на друга, создавая бесконечную цепочку

  • A зависит от B
  • B зависит от C
  • C зависит от A (возвращаемся к началу)

🎯 Типичный пример

Хотите логировать всё в базу данных, но для подключения к БД тоже нужен логгер:

  • Логгер требует подключение к БД
  • Подключение к БД требует логгер

Библиотека обнаруживает такие проблемы на этапе компиляции и сообщает об ошибке.

🧪 Пример проблемы

Демонстрация на GitHub

<?php
declare(strict_types=1);

namespace App;

class A {
    public function __construct(public B $b) {}
}

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

new \Cekta\DI\Compiler(
    containers: [A::class],
)->compile();

💥 Ошибка компиляции

При попытке скомпилировать такой контейнер вы получите исключение:

php bin/build.php

Fatal error: Uncaught Cekta\DI\Exception\InfiniteRecursion: 
Infinite recursion detected for `App\A`, stack: App\A, App\B
in /app/vendor/cekta/di/src/Compiler.php:99
Stack trace:
...

🔍 Что показывает ошибка?

Сообщение об ошибке содержит всю цепочку зависимостей:

  • Infinite recursion detected for **App\A** - проблема обнаружена при создании класса A
  • stack: App\A, App\B - полный путь циклической зависимости
    • Начинаем с A
    • Переходим к B
    • Возвращаемся к A (цикл замкнулся)

Обнаружение бесконечной рекурсии на этапе компиляции - мощная защита от ошибок, которые иначе проявились бы только в runtime. Используйте эту возможность для создания стабильных и надежных приложений.