v2 = C1::$v1; } public function __toString() { return sprintf('%d/%d', $this->v2, C1::$v1); } } class C2 { private static $v1 = 0; private $v2; public function __construct() { C2::$v1++; $this->v2 = C2::$v1; } public function __toString() { return sprintf('%d/%d', $this->v2, C2::$v1); } } class C2Factory { public function createC2() { return new C2(); } } class C { private $c1a; private $c1b; private $c2a; private $c2b; public function __construct(C1 $c1a, C1 $c1b, C2Factory $c2fa, C2Factory $c2fb) { $this->c1a = $c1a; $this->c1b = $c1b; $this->c2a = $c2fa->createC2(); $this->c2b = $c2fb->createC2(); } public function test() { echo sprintf("Default : %s %s\r\n", $this->c1a, $this->c1b); echo sprintf("Factory : %s %s\r\n", $this->c2a, $this->c2b); } } include 'DI/functions.php'; use DI\ContainerBuilder; use function DI\create; use function DI\get; $builder = new ContainerBuilder(); $builder->addDefinitions([C::class => create(C::class)->constructor(get(C1::class), get(C1::class), get(C2Factory::class), get(C2Factory::class)), C1::class => create(C1::class), C2Factory::class => create(C2Factory::class) ]); $cont = $builder->build(); $o = $cont->get(C::class); $o->test(); ?>