当前位置:首页 > PHP教程 > php应用 > 列表

PHP依赖倒置(Dependency Injection)代码实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-16 11:12:42 浏览: 评论:0 

这篇文章主要介绍了PHP依赖倒置(Dependency Injection)代码实例本文只提供实现代码,需要的朋友可以参考下

实现类:

  1. <?php 
  2.  
  3. class Container 
  4.     protected $setings = array(); 
  5.  
  6.     public function set($abstract$concrete = null) 
  7.     { 
  8.         if ($concrete === null) { 
  9.             $concrete = $abstract
  10.         } 
  11.  
  12.         $this->setings[$abstract] = $concrete
  13.     } 
  14.  
  15.     public function get($abstract$parameters = array()) 
  16.     { 
  17.         if (!isset($this->setings[$abstract])) { 
  18.             return null; 
  19.         } 
  20.  
  21.         return $this->build($this->setings[$abstract], $parameters); 
  22.     } 
  23.  
  24.     public function build($concrete$parameters
  25.     { 
  26.         if ($concrete instanceof Closure) { 
  27.             return $concrete($this$parameters); 
  28.         } 
  29.  
  30.         $reflector = new ReflectionClass($concrete); 
  31.  
  32.         if (!$reflector->isInstantiable()) { 
  33.             throw new Exception("Class {$concrete} is not instantiable"); 
  34.         } 
  35.  
  36.         $constructor = $reflector->getConstructor(); 
  37.  
  38.         if (is_null($constructor)) { 
  39.             return $reflector->newInstance(); 
  40.         } 
  41.  
  42.         $parameters = $constructor->getParameters(); 
  43.         $dependencies = $this->getDependencies($parameters); 
  44.  
  45.         return $reflector->newInstanceArgs($dependencies); 
  46.     } 
  47.  
  48.     public function getDependencies($parameters
  49.     { 
  50.         $dependencies = array(); 
  51.         foreach ($parameters as $parameter) { 
  52.             $dependency = $parameter->getClass(); 
  53.             if ($dependency === null) { 
  54.                 if ($parameter->isDefaultValueAvailable()) { 
  55.                     $dependencies[] = $parameter->getDefaultValue(); 
  56.                 } else { 
  57.                     throw new Exception("Can not be resolve class dependency {$parameter->name}"); 
  58.                 } //www.phpfensi.com 
  59.             } else { 
  60.                 $dependencies[] = $this->get($dependency->name); 
  61.             } 
  62.         } 
  63.  
  64.         return $dependencies
  65.     } 

实现实例:

  1. <?php 
  2.  
  3. require 'container.php'
  4.  
  5.  
  6. interface MyInterface{} 
  7. class Foo implements MyInterface{} 
  8. class Bar implements MyInterface{} 
  9. class Baz 
  10.     public function __construct(MyInterface $foo
  11.     { 
  12.         $this->foo = $foo
  13.     } 
  14.  
  15. $container = new Container(); 
  16. $container->set('Baz''Baz'); 
  17. $container->set('MyInterface''Foo'); 
  18. $baz = $container->get('Baz'); 
  19. print_r($baz); 
  20. $container->set('MyInterface''Bar'); 
  21. $baz = $container->get('Baz'); 
  22. print_r($baz); 

Tags: PHP依赖倒置

分享到: