https://my.oschina.net/u/3529405/blog/1821744
<?PHP/** * 依赖注入 IOC DI * 参考文章 * https://segmentfault.com/a/1190000002411255 * https://segmentfault.com/a/1190000002424023 *//** * IOC * 控制反转 Inversion of Control * 依赖关系的转移 * 依赖抽象而非实践 * 比较实用的注入方式有三种 * Setter injection 使用setter方法 * Constructor injection 使用构造函数 * Property Injection 直接设置属性 */// IOC 栗子// 假设一个储存业务// 定义接口 业务需求一个数据储存 到rIDes 或者 MysqL 中interface SaveIO { public function set ();}// 定义两种储存方式 并继承(implements)SaveIO 接口// rIDesclass RIDesClass implements SaveIO { public function set () { echo 'rIDes_save'.PHP_Eol; }}// MysqLclass MysqLClass implements SaveIO { public function set (){ echo 'MysqL_save'.PHP_Eol; }}// 高层业务class Business { private $myBusiness; public function __construct ($ioc) { $this->myBusiness = $ioc; } public function save () { $this->myBusiness->set(); } // 替换依赖 public function replaceIOC ($ioc) { $this->myBusiness = $ioc; }}echo 'IOC------'.PHP_Eol;$bus = new Business(new RIDesClass());$bus->save(); // 输出rIDes_save// 替换成其他依赖$bus->replaceIOC(new MysqLClass());$bus->save(); // 输出 MysqL_save/** * DI * 依赖注入 Dependency Injection * 容器自动根据配置,将依赖注入指定对象 * 管理应用程序中的『全局』对象(包括实例化、处理依赖关系)。 * 可以延时加载对象(仅用到时才创建对象)。 * 促进编写可重用、可测试和松耦合的代码。 */// 首先需要一个容器class ConComponent { protected $_di = array(); // 注册 依赖 让依赖存储在$_di 存储形式 $_di->['服务名称']->Closure public function register ($@R_419_6889@,$service) { $this->_di[$@R_419_6889@] = $service; } /** * public function save ($@R_419_6889@) * 高层业务,可以另外拓展一个类,不要放在容器里 * (这里只是一个简易的写法,但是不要这样写) * 实现 class{ * $构造函数=容器返回依赖 * 高层业务根据需求 * 通过$_di[class@R_419_6889@]()创建依赖类 * 通过$_di[class@R_419_6889@]()->实现业务 * } * @param $@R_419_6889@ */ public function save ($@R_419_6889@) { $this->_di[$@R_419_6889@]()->set(); }}/* * 重复利用 RedisClass MysqLClass * 注册依赖 * */$component = new ConComponent(); // 创建容器/* * 注册依赖 * @param @R_419_6889@ 依赖的名称 * @param function(){} 是一个闭包(closure) * 所以只有在我们调用一次 $component->_di[@R_419_6889@] * 才会创建一个依赖对象 实现需时创建 * */$component->register('RedisClass',function () { return new RIDesClass();});$component->register('MysqLClass',function () { return new MysqLClass();});echo 'di----'.PHP_Eol;$component->save('RedisClass'); // 输出rIDes_save$component->save('MysqLClass'); // 输出MysqL_save/** * AOP * Aspect-orIEnted programming * 面向方面编程 * 无需修改任何一行程序代码, * 将功能加入至原先的应用程序中, * 也可以在不修改任何程序的情况下移除 */
总结
以上是内存溢出为你收集整理的PHP 依赖注入,依赖反转 (IOC-DI)全部内容,希望文章能够帮你解决PHP 依赖注入,依赖反转 (IOC-DI)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)