Обнаружение бесконечной рекурсии зависимостей
❓ Что такое бесконечная рекурсия зависимостей?
Это ситуация, когда зависимости циклически ссылаются друг на друга, создавая бесконечную цепочку
- A зависит от B
- B зависит от C
- C зависит от A (возвращаемся к началу)
🎯 Типичный пример
Хотите логировать всё в базу данных, но для подключения к БД тоже нужен логгер:
- Логгер требует подключение к БД
- Подключение к БД требует логгер
Библиотека обнаруживает такие проблемы на этапе компиляции и сообщает об ошибке.
🧪 Пример проблемы
<?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**- проблема обнаружена при создании класса Astack: App\A, App\B- полный путь циклической зависимости- Начинаем с A
- Переходим к B
- Возвращаемся к A (цикл замкнулся)
Обнаружение бесконечной рекурсии на этапе компиляции - мощная защита от ошибок, которые иначе проявились бы только в runtime. Используйте эту возможность для создания стабильных и надежных приложений.