实现类:
<?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);
应用场景 电脑在以前维修的话是根本不可能的事,可是现在却特别容易,比如说内存坏了,买个内存条,硬盘坏了,买个硬盘换上。为啥这么方便?从修电脑里面就有面相对象的几大设计原则,比如单一职责原则,内存坏了,不应该成为更换CPU的理由,它们各自的职责是明确的。再比如开放-封闭原则,内存不够只要插槽足够就可以添加。还有依赖倒转原则,原话解释是抽象不应该依赖细节,细节应该依赖于抽象,说白了,就是要针对接口编程
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle )。 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/22/solid-javascript-the-dependency-inversion-principle/ 依
本文向大家介绍分析并输出Python代码依赖的库的实现代码,包括了分析并输出Python代码依赖的库的实现代码的使用技巧和注意事项,需要的朋友参考一下 用法: 分析一个脚本的依赖: analysis_dependency.py script1.py 递归分析依赖: analysis_dependency.py script1.py -r
本文向大家介绍PHP面向对象五大原则之依赖倒置原则(DIP)详解,包括了PHP面向对象五大原则之依赖倒置原则(DIP)详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP面向对象五大原则之依赖倒置原则(DIP)。分享给大家供大家参考,具体如下: 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依
本文向大家介绍js实现倒计时关键代码,包括了js实现倒计时关键代码的使用技巧和注意事项,需要的朋友参考一下 我们经常会在一些电商网站上看到秒杀倒计时,双11倒计时.其实倒计时的效果实现起来也是很简单的,并不复杂. 首先呢,开始写之前一定要理清楚思路,思路清晰了,那写起来就容易多了,下面我分了几个步骤: 1.获取当前的时间,并且定义结束的时间 2.用求未来时间和当前时间的时间差,并且求出时分秒 3.
本文向大家介绍js简单倒计时实现代码,包括了js简单倒计时实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js简单倒计时实现代码。分享给大家供大家参考,具体如下: 更多关于JavaScript相关内容可查看本站专题:《JavaScript时间与日期操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技