PHP依赖倒置(Dependency Injection)代码实例
2014-10-11 00:00
537 查看
实现类:
实现实例:
<?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依赖倒置(Dependency Injection)代码实例
- PHP实例:精确到每一秒钟的在线人数显示代码
- PHP页面间传递参数实例代码
- PHP伪造referer实例代码
- php AJAX POST的使用实例代码
- php分页实例教程代码详解
- PHP MYSQL实例:网站在线人数的程序代码
- PHP生成HTML静态页面实例代码
- PHP生成HTML静态页面实例代码
- php+mysql写的简单留言本实例代码
- PHP写AJAX时怎么禁用缓存和编码实例代码
- PHP页面间传递参数实例代码
- PHP中MD5函数使用实例代码
- PHP时间戳使用实例代码
- php ajax无刷新上传图片实例代码
- PHP组合查询多条件查询实例代码第1/2页
- PHP时间戳使用实例代码
- 坏狼php学习 计数器实例代码
- 利用discuz实现PHP大文件上传应用实例代码
- PHP生成HTML静态页面实例代码