这篇文章主要介绍了php依赖倒置(dependency injection)代码实例本文只提供实现代码,需要的朋友可以参考下
实现类:
<?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);
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注!
相关推荐:
关于php和jquery 注册模块的开发
关于php – easyui datagrid 资料存的方法介绍
以上就是关于php的依赖倒置(dependency injection)的详细内容。
