Навеяло обсуждением в другой теме.
Сразу хочу сказать что все описанное ниже из разряда извращений и только для коробочных продуктов где важно расширение любого функционала сторонними модулями и в данный момент самое жизнеспособное решение это через цепочку наследования (пример xenforo/magento).
но с таким подходом нормальное явное DI в конструкторе не сделать:
	
	
	
		
Setter/Property injection - фигово тем что или описание зависимостей находится полностью отдельно от класса, в конфиге контейнера и к тому же есть возможность инстанцировать полностью невалидный класс.
Ну и любимый мной SL - одна супер зависимость - контейнер, которая рулит всем (как раз так и делают везде)
Как еще можно сделать инъекцию зависимостей чтобы было более менее явно, описано не в контейнере, а в самом классе и чтобы можно было так наследовать? Ну или как еще расширять коробочный продукт, независимыми модулями (вариант событий/хуков в определенных точках не позволяет сделать что угодно)?
P.S. Понимаю что задача изначально - извращение, но коробочные продукты они такие
								Сразу хочу сказать что все описанное ниже из разряда извращений и только для коробочных продуктов где важно расширение любого функционала сторонними модулями и в данный момент самое жизнеспособное решение это через цепочку наследования (пример xenforo/magento).
но с таким подходом нормальное явное DI в конструкторе не сделать:
		PHP:
	
	//базовый
class Main {
    public $dep1;
    __construct(Dep1 $dep1) {
        $this->dep1 = $dep1;
    }
}
//пример цепочки наследования для первого модуля
//здесь проблем нет, т.к. 100% известен родитель
class AddonMain extends Proxy_AddonMain {
    public $dep2;
    __construct(Dep1 $dep1, Dep2 $dep2) {
        parent::__construct($dep1);
        $this->dep2 = $dep2;
    }
}
// класс Proxy_AddonMain вычисляется динамически через class_alias или через генерацию прокси прокладки:
class Proxy_AddonMain extends Main {}
//вот когда модулей больше 2-х и их порядок при написании кода не может быть известен то нормальный явный конструктор уже не сделать:
class Addon2Main extends Proxy_Addon2Main {
    public $dep3;
    //заранее не известны зависимости родителя потому правильную сигнатуру не сделать
    // splat оператор и магия через рефлексию - все очень не явно
    __construct(Dep1 $dep1, Dep2 $dep3) { // это ломает все
        parent::__construct($dep1);
        $this->dep3 = $dep3;
    }
}Ну и любимый мной SL - одна супер зависимость - контейнер, которая рулит всем (как раз так и делают везде)
Как еще можно сделать инъекцию зависимостей чтобы было более менее явно, описано не в контейнере, а в самом классе и чтобы можно было так наследовать? Ну или как еще расширять коробочный продукт, независимыми модулями (вариант событий/хуков в определенных точках не позволяет сделать что угодно)?
P.S. Понимаю что задача изначально - извращение, но коробочные продукты они такие

 
	            
 
 
		 )))) Да, гавно. Но по другому никак
)))) Да, гавно. Но по другому никак 