Наипростейший DI-контейнер
1. Возможность добавить зависимости автосборщиком в конструктор. 2. Возможность ручного добавления зависимостей. 3. Автовайринг.
<?php use Closure; use Exception; use ReflectionClass; class Container { private $dependencies; private $result = []; public function __construct($dependencies = []) { $this->dependencies = $dependencies; } public function set($key, $value) { } $this->dependencies[$key] = $value; return $this; } public function has($key) { } public function get($key) { return $this->result[$key]; } $reflectionClass = new ReflectionClass($key); $args = []; if ($constructor = $reflectionClass->getConstructor()) { foreach ($constructor->getParameters() as $parameter) { if (!$parameter->isDefaultValueAvailable()) { throw new Exception("Не указано значение по умолчанию параметра: $parameter->name"); } $args[] = $parameter->getDefaultValue(); } else { } } } return $this->result[$key] = $reflectionClass->newInstanceArgs($args); } throw new Exception("Не найдена зависимость: $key"); } $dependency = $this->dependencies[$key]; if ($dependency instanceof Closure) { $this->result[$key] = $dependency($this); } else { $this->result[$key] = $dependency; } return $this->result[$key]; } }