PHP Dependency Injection Container
<?php | |
class Container | |
{ | |
protected $setings = array(); | |
public function set($abstract, $concrete = null) | |
{ | |
if ($concrete === null) { | |
$concrete = $abstract; | |
} | |
$this->setings[$abstract] = $concrete; | |
} | |
public function get($abstract, $parameters = array()) | |
{ | |
if (!isset($this->setings[$abstract])) { | |
return null; | |
} | |
return $this->build($this->setings[$abstract], $parameters); | |
} | |
public function build($concrete, $parameters) | |
{ | |
if ($concrete instanceof Closure) { | |
return $concrete($this, $parameters); | |
} | |
$reflector = new ReflectionClass($concrete); | |
if (!$reflector->isInstantiable()) { | |
throw new Exception("Class {$concrete} is not instantiable"); | |
} | |
$constructor = $reflector->getConstructor(); | |
if (is_null($constructor)) { | |
return $reflector->newInstance(); | |
} | |
$parameters = $constructor->getParameters(); | |
$dependencies = $this->getDependencies($parameters); | |
return $reflector->newInstanceArgs($dependencies); | |
} | |
public function getDependencies($parameters) | |
{ | |
$dependencies = array(); | |
foreach ($parameters as $parameter) { | |
$dependency = $parameter->getClass(); | |
if ($dependency === null) { | |
if ($parameter->isDefaultValueAvailable()) { | |
$dependencies[] = $parameter->getDefaultValue(); | |
} else { | |
throw new Exception("Can not be resolve class dependency {$parameter->name}"); | |
} | |
} else { | |
$dependencies[] = $this->get($dependency->name); | |
} | |
} | |
return $dependencies; | |
} | |
} |
<?php | |
require 'container.php'; | |
interface MyInterface{} | |
class Foo implements MyInterface{} | |
class Bar implements MyInterface{} | |
class Baz | |
{ | |
public function __construct(MyInterface $foo) | |
{ | |
$this->foo = $foo; | |
} | |
} | |
$container = new Container(); | |
$container->set('Baz', 'Baz'); | |
$container->set('MyInterface', 'Foo'); | |
$baz = $container->get('Baz'); | |
print_r($baz); | |
$container->set('MyInterface', 'Bar'); | |
$baz = $container->get('Baz'); | |
print_r($baz); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment