Простой пример DI

Простейшая аналогия 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;

Ссылка на пример работы

Loading

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *