DI依赖注入和单例模式
DI依赖注⼊和单例模式
PHALAPI-进阶篇2(DI依赖注⼊和单例模式)
前⾔
先在这⾥感谢phalapi框架创始⼈@dogstar,为我们提供了这 ⼀个优秀的开源框架.
离上⼀次更新过去了快两周,在其中编写了⼀个关于DB分表分库解决⼤数据量的拓 ,
有兴趣的童鞋可以了解了解.废话不多说,本⼩节在于解释⼀下在PhalApi框架中两个⽐
较好的思想,单例模式和依赖注⼊.
附上:
喵了个咪的博客:
官⽹地址:/
开源中国Git地址:/dogstar/PhalApi/tree/release
1. 单例模式
单例模式对于长期进⾏过⾯向对象编程的童鞋应该不算陌⽣,对学习php的童鞋也应该
有听过,这⾥简单的聊⼀聊单例模式它到底是⼀个怎么样的东东,解决了怎么样的问题,
并且在PhalApi中它是如何实现的.
单例单例,所谓单例也就是保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问
点,这就是单例,不难看出他的好处:资源利⽤少,因为只有⼀个,⼤家都是知道要使⽤
⼀个类必须要实例他,也就是new,在每次new⼀个对象的时候都会在内存中⽣成⼀块
区域来存放这个实例,如果在程序⼀次运⾏中使⽤了很多的new实例化了同⼀个对象,那
就⽐较消耗资源了,但是如果是通⽤⼀个使⽤全局变量global程序又会显得不那么优雅
⽽且会很乱,在这种情况下,单例模式就产⽣了.
单例模式是⼀个很好的解决⽅案,既可以全局通⽤,又不必担⼼占⽤过多的资源,且⾮
常优雅。我们来⼀起看看在PhalApi中是如何实现单例模式的:
//⼤家看到我们常⽤的DI⽅法内部实现的是PhalApi_DI中的静态⽅法one⽅法
function DI() {
return PhalApi_DI::one();
}
然后我们看向one⽅法内部
每当请求过来时先验证静态变量instance是否已被类初始化赋值,若⽆,则会在内部去
实例化PhalApi_DI类,然后赋值给$instance并返回,若有,则当下次请求过来时,直接
返回已实例化的对象。简⾔之,PhalApi框架所有的地⽅使⽤的DI⽅法,其实都是返回
同⼀个对象实例,在内存中只存在⼀块区域,代码如下:
public static function one(){
if(self::$instance == N LL){
self::$instance = new PhalApi_DI();
self::$instance->onConstruct();
}
return self::$instance;
}
2. 依赖注⼊
依赖注⼊又称之为"控制反转",如果是熟悉javaweb开发的spring框架应该有⽐较深的
感触,在这⾥也不往深的讲,就简单讲解⼀下PhalApi中DI依赖注⼊的实现,以便让⼤家
了解这种设计模式实现原理以及⾃此基础上实现的惰性加载机制.
2.1 DI依赖注⼊实现
⼤家在PhalApi中常⽤的DI()⽅法,也就是采⽤我们上⾯所谓的单例模式,我们每次使⽤
DI()就是在使⽤PhalApi_DI类,其实我们依赖注⼊的关键也就是在PhalApi DI之中
先来讲⼀下他的⼀个实现⽅式再来讲具体实现,这⾥举个例⼦:
//配置
DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');
其实在内部有⼀个数组,它把config作为了key,把ne PhalApi_Config_File(API_ROOT
. '/Config')作为了value,然后保存了起来。当我们下⼀次使⽤DI->config->get()的时
候,它就会根据key值config拿出开始new好的类,所以可以说config操作是依赖于DI() ,
⽽且在使⽤DI()->config的时候永远都是在使⽤同⼀个实例,减少资源的消耗.
有的童鞋就好奇了为什么DI()->config会存到数组⾥⽽在需要的时候会拿出来?感兴趣
的童鞋可以百度⼀下魔法⽅法set和get
/**⼤家可以看到这是PhalApi_DI中的魔法⽅法__set
* 也就是当使⽤DI()->config = new PhalApi_Config_File(API_ROOT . '/
* 得的name值就是config, 得的value也就是new PhalApi_Config_File(AP
*/get同理,在内部实现都是调⽤