Простейшая аналогия DI. Объект который занимается настройкой объектов внутри себя и разрешает их зависимости
class di { public $instances; public function setDef($name, $instance){ $this->instances[$name] = $instance; } public function get($name){ if(isset($this->instances[$name])){ $o = (new ReflectionClass($name))->getConstructor(); if($o === null || null === $o->getParameters()){ return new $this->instances[$name](); } else { $p = $o->getParameters(); $instancesArray = []; foreach($p as $i){ $instancesArray[] = $this->get($i->getClass()->name); } $inst = new ReflectionClass($this->instances[$name]); return $inst->newInstanceArgs($instancesArray); } } } } class base { public $b = "base !!!"; } class second { public $s = "second !!!"; } class a { public $base; public $second; public function __construct(base $b, second $s){ $this->base = $b; $this->second = $s; } } $di = new di(); $di->setDef('second', second::class); $di->setDef('base', base::class); $di->setDef('a', a::class); $o = $di->get('a'); echo $o->base->b; echo "<br>"; echo $o->second->s;
Ссылка на пример работы