phalapi可以依赖注入么_[7.8]-phalapi-进阶篇2(DI依赖注入和单例模式) | PhalApi(π框架) - PHP轻量级开源接口框架...
phalapi-进阶篇2(DI依赖注入和单例模式)
前言
先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架.
离上一次更新过去了快两周,在其中编写了一个关于DB分表分库解决大数据量的拓展,有兴趣的童鞋可以了解了解.废话不多说,本小节在于解释一下在PhalApi框架中两个比较好的思想,单例模式和依赖注入.
附上:
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 == NULL){
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,把new 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 . '/Config');的时候
* 获得的name值就是config,获得的value也就是new PhalApi_Config_File(API_ROOT . '/Config');
*/get同理,在内部实现都是调用了内部get和set方法
public function __set($name, $value){
$this->set($name, $value);
}
public function __get($name){
return $this->get($name, NULL);
}
看完之后大家是不是觉得很简单啊,大家以后也可以在设计自己的类的时候采用这种灵活的魔法方法实现.
2.2 惰性加载
在PhalApi中的DI()方法也提供惰性加载,惰性加载如字意也就是当类没有被使用到的时候不会被加载,这样的操作也是为了避免浪费不必要的资源,当我们不使用的时候永远不会去实例化,只有当你使用到的时候才会去实例化。接下来,我们来看看是如何实现的.
//当我们执行以下语句的时候,在依赖注入的时候存的是value值是字符串的test
DI()->test = 'test';
//使用DI()->test->test();的时候会使用到PhalApi中的get方法,在get方法中有一段代码
$this->data[$key] = $this->initService($this->data[$key]);
//在initService方法内部验证了value是字符串就实例化了再返回
if($config instanceOf Closure){
$rs = $config();
}elseif(is_string($config) && class_exists($config)){
$rs = new $config();
if(is_callable(array($rs, 'onInitialize'))){
call_user_func(array($rs, 'onInitialize'));
}
}else{
$rs = $config;
}
3. 总结
在本节中简单的讲解了关于单例模式,依赖注入以及惰性加载,这几种设计模式都是常用的,能够减少资源利用率,希望大家看了这篇介绍能够亲自地去体验一下PhalApi中的这几种模式。在下一小节就讲解如何构建自己的拦截器,希望大家能够继续关注!
注:笔者能力有限,有说的不对的地方,希望大家能够指出,也希望多多交流!
官网QQ交流群:421032344 欢迎大家的加入!
phalapi可以依赖注入么_[7.8]-phalapi-进阶篇2(DI依赖注入和单例模式) | PhalApi(π框架) - PHP轻量级开源接口框架...相关推荐
- php调用好单库api视频教程,[8.1]-PhalApi视频教程 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
[8.1] PhalApi视频教程 先在这里感谢以下录制小组的同学,是你们让世界看到PhalApi的视频教程! A西瓜妹子.听风不语.彩色的雨.Catch.喵了个咪.dogstar PhalApi教程 ...
- phalapi 数据库锁_[7.11]-phalapi-进阶篇5(数据库读写分离) | PhalApi(π框架) - PHP轻量级开源接口框架...
phalapi-进阶篇5(数据库读写分离以及多库使用) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 读写分离是我们常用的一种解决方案,它可以解决大 ...
- php api 无符号整数基数为16的整数参数的字符串表示形式,[1.12]-参数规则:接口参数规则配置 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
"播下一种思想,收获一种行为:播下一种行为,收获一种习惯:播下一种习惯,收获一种性格:播下一种性格,收获一种命运." --<成君忆:水煮三国> 1.12.1 参数解析 ...
- php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
1.23.1 请求 把我们后台的API想象成一个函数,那么请求的参数就是我们的参数列表:而接口响应的数据则对应函数返回的结果. 对于请求,正如前面所看到的,我们可以使用$_GET,也可以使用$_POS ...
- php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
3.3.1 扩展类库:基于PHPMailer的邮件发送 此扩展可用于发送邮件. 3.3.2 安装和配置 从 PhalApi-Library 扩展库中下载获取 PHPMailer 包,如使用: $ gi ...
- phalapi可以依赖注入么_phalapi-进阶篇2(DI依赖注入和单例模式)
phalapi-进阶篇2(DI依赖注入和单例模式) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 离上一次更新过去了快两周,在其中编写了一个关于DB ...
- 轻量级PHP接口框架PhalApi开源接口框架 v2.17.1源码
简介: PhalApi简称π框架(派框架),一个轻量级PHP开源接口框架,配套运营管理平台,专注于接口服务开发,支持HTTP/SOAP/RPC协议,拥有自动生成的在线文档.多种开发语言的客户端SDK包 ...
- gradle 查看依赖类库版本_如何查找第三方库(Gradle引用)的依赖?
原标题:如何查找第三方库(Gradle引用)的依赖? 如何查找第三方库(Gradle引用)的依赖? 每日一问-Tools-20181105 答: 三方法可查找. 1. 执行 Gradle Task : ...
- python依赖平台吗_在Python中创建快速循环最依赖于平台和pythonversion的方法是什么?...
我正在用Python编写一个科学应用程序,其核心是一个处理器密集型的循环.我希望尽可能地优化这一点,将给最终用户带来的不便降到最低,他们可能会将其作为Python脚本的未编译集合,并将使用Window ...
最新文章
- oracle层次查询用处,Oracle描述层次查询(hierarchicalquery)
- Bzoj3060 [Poi2012]Tour de Byteotia
- 韩寒 一个 新版本 android 收藏,韩寒的应用《ONE·一个》正式登陆Android平台,韩寒称一年运营成本约250万...
- QAction添加事件响应
- 安卓手机刷软路由_华为路由AX3 Pro上手测评:用过最方便的路由器,没有之一...
- jqgrid for asp.net 单页全选记录ID
- C# 数组增加元素_C语言数组——任意位置插入一个元素
- 远程办公一晃一天,环境搭建履步维艰
- 软件设计师-2.程序设计语言
- 人人视频android app,人人视频安卓版
- Python实现程序运行时间度量分析
- 用友杨雨春 融合是企业互联网化的下一个主旋律
- ArchLinux安装fcitx5-rime
- ISO/IEC 27018公有云中个人身份信息管理体系认证概述
- 为什么创造 Charj 语言?从十年以后的编程说起
- 深度学习笔记其七:计算机视觉和PYTORCH
- 第十届蓝桥杯大赛软件类省赛 JAVA 大学 A 组
- JAVA——34.集合函数-List
- c语言数列求和中有乘法,C语言数列求和(使用while循环)
- 计算机大错误,计算机10大经典错误[图解](5页)-原创力文档