Implementation class:
Copy Code code as follows:
<?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;
}
}
Implementation instance:
Copy Code code as follows:
<?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);