Давай я тебе поясню, что синтаксис тут не причем
Объявление карты у меня
$container = new \PDIC\Container([
'?a' => '*' . TestEntryAsFactory::class,
TestEntryAsFactory::class => [
'service' => TestEntryAsService::class,
],
]);
Объявление карты у тебя
$container = new \ABCDIC\Container;
$container->typeProperties(true);
$container->setMaps([
'a' => [
TestEntryAsFactory::class,
'service' => 'service',
],
], [
'service' => [
function () {
return new TestEntryAsService;
}
]
]);
Разница в синтаксисе этих карт зависимостей лишь в том, что один использует явные синтаксические маркеры (PDIC), другой структуру массива как синтаксический маркер (ABCDIC).
Но супер разницы нет, они решают задачу объявления карты зависимостей.
Проблемы в том как эти карты имплементируются контейнером:
PDIC:
'?a' => '*' . TestEntryAsFactory::class, // если в начале ключа стоит вопрос, значит это алиас для конкретного класс который указан в значении, в начала значения стоит * значит этот класс всегда будет возвращать по этому алиасу как новый
TestEntryAsFactory::class => // вопроса в начале ключа нет, значит это просто описание сущности в контейнере
'service' => TestEntryAsService::class, // в начале ключа нет никаких символов, значит будет внедрение через свойство, ключ в начале не содержит ни каких символов, значит по этому классу будут инициализирован объект и подставлен как сервис, если бы была звездочка, то был бы фабричный метод
Все больше тебе не надо париться, просто прими правила синтаксиса и контейнер будет делать то что ты скажешь.
ABCDIC:
$container->typeProperties(true); // Надо указать контейнеру, как он будет вести себя поумолчанию
$container->setMaps([ // введено понятие фабричных и сервисных сущностей
'a' => [ // объявили алиас для фабричной сущности, но эта сущность при запросе через get почему-то является сервисом, а при внедрении контейнером является фабрикой
TestEntryAsFactory::class, // указали класс
'service' => 'service', // указали зависимость, тип пока не знаем, но забегая вперед можно предположить чтобы это было как сервис
'service' => [ // объявили алиас для сервисной и фабричной сущности
function () { // готовим сущность по особенному, возвращаем результат в контейнер
return new TestEntryAsService;
} // объявили функцию для подготовки сервисной сущности, но по факту это фабричная сущность несмотря на то что она указана в блоке с сервисами. При том если объявить эту сущность через название класса, то эта сущность будет сервисом.
Нужно париться на счет контекстов выполнения, нужно понимать как контейнер в том или ином случае поведет себя, а в некоторых случаях он просто не позволяет сделать то что нужно, хотя судя по синтаксису карты он должен это делать.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации