依赖注入
简介:依赖注入依赖注入
EasySwoole实现了简单版的国际奥委会,使用国际奥委会容器可以很方便的存储/获取资源,实现解耦。
使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
在我们的日常开发中,创建对象的操作随处可见以至于对其十分熟悉的同时又感觉十分繁琐,每次需要对象都需要亲手将其新出来,甚至某些情况下由于坏编程习惯还会造成对象无法被回收,这是相当糟糕的。但更为严重的是,我们一直倡导的松耦合,少* * *原则,这种情况下变得一无是处。于是前辈们开始谋求改变这种编程陋习,考虑如何使用编码更加解耦合,由此而来的解决方案是面向接口的编程。
——摘自《easyswoole开发文档》
引用>本文将解析并实现下列功能。
<李> 1,单例模式的巧妙实现。李> <李> 2,通过Di方式实现简单的容器,方便存取资源,从而达到解耦的目的。李>
引用>代码实现h5> <编辑>文件结构编辑>
<李> \客户机。李php功能调用入口> <李> \ AbstractInterface \单例。李php单例抽象接口> <李> \ Lib \复述。李php复述,服务类> <李> \ \ Di服务。php依赖注入实现简单奥委会容器李>
<编辑>单例实现过程解读编辑>client.php
<代码> & lt; ? php/* * *由PhpStorm。 *用户:zrj *日期:19-1-14 *时间:下午4:39 */名称空间的应用程序; 定义(“APP_ROOT”,目录名(__FILE__)); 使用异常; 使用Yaconf; require_once APP_ROOT。'/Lib/Redis.php '; require_once APP_ROOT。'/服务/Di.php '; 使用App \ Lib \复述; 使用App \服务\迪; 尝试{ 如果(! Yaconf:: (' easyswoole_api '))抛出新的异常(的项目配置ini文件不存在的); $ redisConfig=Yaconf: get (“easyswoole_api”)(“复述”)? ?[]; 如果(空(redisConfig美元))抛出新的异常(的项目复述,配置不存在的); $ config=( “主机”=比;(字符串)redisConfig美元['主机']? ?”, “端口”=比;(int) redisConfig美元(“港口”)? ?”, “超时”=比;(字符串)redisConfig美元(“超时”)? ?”, “密码”=比;(字符串)redisConfig美元(“密码”)? ?”, “数据库”=比;(int) redisConfig美元(“数据库”)? ?”, ];//直接访问//复述:getInstance ($ config)→设置(‘你好’,‘世界’);//echo复述:getInstance ($ config)→(“你好”);//Di: getInstance()→明确();//注入容器//椒ㄒ?注入实例//Di: getInstance()→设置(“复述”,\ App \ Lib \复述::getInstance ($ config));//椒ǘ?容器内部实例化(支持单例模式) 迪:getInstance()→设置(“复述”,\ App \ Lib \复述::类、配置美元);//通过容器获取实例 $ redisInstance=Di: getInstance()→(“复述”); 美元redisInstance→设置(“亲爱的”,“回族”); 回声redisInstance→美元(“你好”)。PHP_EOL; 回声redisInstance→美元(“亲爱的”)。PHP_EOL; }捕获异常(\ $ e) {//把$ e; echo $ e→getMessage (); } 代码>\ AbstractInterface \单例。php单例抽象接口
<代码>名称空间应用\ AbstractInterface; #声明为特性 品质单 { 私有静态实例美元; 公共静态函数getInstance(…美元args) { 如果(!收取(self:: $)) {//通过静态静态绑定来新绑定的对象 自我::$实例=新的静态(…美元args); } 返回self:: $实例; } } 代码>\ Lib \复述。php复述,服务类
<代码>名称空间应用\ Lib。 require_once APP_ROOT。“/AbstractInterface/Singleton.php”; 使用App \ AbstractInterface \单; 类复述, {//这里通过使用特性来扩展复述,类的能力//借助单例中的getInstance来新本类,创建复述,连接实例//复述:getInstance (…) 使用单例; 私人connectInstance美元=零;/* * *复述,构造函数。 * @param数组redisConfig美元 * @throws \例外 */私有函数__construct(数组redisConfig美元) { 尝试{//通过yaconf读取配置ini 如果(! extension_loaded(“复述”))抛出新\异常(复述,扩展不安装); $ this→connectInstance=new \复述(); 结果=这→美元connectInstance→连接(redisConfig美元['主机'],美元redisConfig(“港口”),美元redisConfig[“超时”]); $ this→connectInstance→身份验证($ redisConfig['密码']); $ this→connectInstance→选择($ redisConfig['数据库']); 如果美元的结果===false)抛出新\异常(“复述,服务器连接失败”); }捕获异常(\ $ e) { 把$ e; } } 公共函数__call(名称、参数)美元 { 返回$ this→connectInstance→美元(…美元参数)名称; } }浅析easyswoole源码Di原理与实现