实现类:
<br /><?php<br /> <br />class Container<br />{<br /> protected $setings = array();<br /> <br /> public function set($abstract, $concrete = null)<br /> {<br /> if ($concrete === null) {<br /> $concrete = $abstract;<br /> }<br /> <br /> $this->setings[$abstract] = $concrete;<br /> }<br /> <br /> public function get($abstract, $parameters = array())<br /> {<br /> if (!isset($this->setings[$abstract])) {<br /> return null;<br /> }<br /> <br /> return $this->build($this->setings[$abstract], $parameters);<br /> }<br /> <br /> public function build($concrete, $parameters)<br /> {<br /> if ($concrete instanceof Closure) {<br /> return $concrete($this, $parameters);<br /> }<br /> <br /> $reflector = new ReflectionClass($concrete);<br /> <br /> if (!$reflector->isInstantiable()) {<br /> throw new Exception("Class {$concrete} is not instantiable");<br /> }<br /> <br /> $constructor = $reflector->getConstructor();<br /> <br /> if (is_null($constructor)) {<br /> return $reflector->newInstance();<br /> }<br /> <br /> $parameters = $constructor->getParameters();<br /> $dependencies = $this->getDependencies($parameters);<br /> <br /> return $reflector->newInstanceArgs($dependencies);<br /> }<br /> <br /> public function getDependencies($parameters)<br /> {<br /> $dependencies = array();<br /> foreach ($parameters as $parameter) {<br /> $dependency = $parameter->getClass();<br /> if ($dependency === null) {<br /> if ($parameter->isDefaultValueAvailable()) {<br /> $dependencies[] = $parameter->getDefaultValue();<br /> } else {<br /> <strong style="color:transparent">9来源gaodai#ma#com搞@代~码$网</strong>搞gaodaima代码 throw new Exception("Can not be resolve class dependency {$parameter->name}");<br /> }<br /> } else {<br /> $dependencies[] = $this->get($dependency->name);<br /> }<br /> }<br /> <br /> return $dependencies;<br /> }<br />}<br />
实现实例:
<br /><?php<br /> <br />require 'container.php';<br /> <br /> <br />interface MyInterface{}<br />class Foo implements MyInterface{}<br />class Bar implements MyInterface{}<br />class Baz<br />{<br /> public function __construct(MyInterface $foo)<br /> {<br /> $this->foo = $foo;<br /> }<br />}<br /> <br />$container = new Container();<br />$container->set('Baz', 'Baz');<br />$container->set('MyInterface', 'Foo');<br />$baz = $container->get('Baz');<br />print_r($baz);<br />$container->set('MyInterface', 'Bar');<br />$baz = $container->get('Baz');<br />print_r($baz);<br />