博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP写的一个轻量级的DI容器类
阅读量:7066 次
发布时间:2019-06-28

本文共 3218 字,大约阅读时间需要 10 分钟。

  hot3.png

直接上代码吧.

Di容器类:

_instances[$name])){ return $this->_instances[$name]; } //检测有没有注册该服务 if(!isset($this->_bindings[$name])){ return null; } $concrete = $this->_bindings[$name]['class'];//对象具体注册内容 $obj = null; //匿名函数方式 if($concrete instanceof \Closure){ $obj = call_user_func_array($concrete,$params); } //字符串方式 elseif(is_string($concrete)){ if(empty($params)){ $obj = new $concrete; }else{ //带参数的类实例化,使用反射 $class = new \ReflectionClass($concrete); $obj = $class->newInstanceArgs($params); } } //如果是共享服务,则写入_instances列表,下次直接取回 if($this->_bindings[$name]['shared'] == true && $obj){ $this->_instances[$name] = $obj; } return $obj; } //检测是否已经绑定 public function has($name){ return isset($this->_bindings[$name]) or isset($this->_instances[$name]); } //卸载服务 public function remove($name){ unset($this->_bindings[$name],$this->_instances[$name]); } //设置服务 public function set($name,$class){ $this->_registerService($name, $class); } //设置共享服务 public function setShared($name,$class){ $this->_registerService($name, $class, true); } //注册服务 private function _registerService($name,$class,$shared=false){ $this->remove($name); if(!($class instanceof \Closure) && is_object($class)){ $this->_instances[$name] = $class; }else{ $this->_bindings[$name] = array("class"=>$class,"shared"=>$shared); } } //ArrayAccess接口,检测服务是否存在 public function offsetExists($offset) { return $this->has($offset); } //ArrayAccess接口,以$di[$name]方式获取服务 public function offsetGet($offset) { return $this->get($offset); } //ArrayAccess接口,以$di[$name]=$value方式注册服务,非共享 public function offsetSet($offset, $value) { return $this->set($offset,$value); } //ArrayAccess接口,以unset($di[$name])方式卸载服务 public function offsetUnset($offset) { return $this->remove($offset); }}

演示:

name = $name; }}include "Di.class.php";$di = new Di();//匿名函数方式注册一个名为a1的服务$di->setShared('a1',function($name=""){ return new A($name);});//直接以类名方式注册$di->set('a2','A');//直接传入实例化的对象$di->set('a3',new A("小唐"));$a1 = $di->get('a1',array("小李"));echo $a1->name."
";//小李$a1_1 = $di->get('a1',array("小王"));echo $a1->name."
";//小李echo $a1_1->name."
";//小李$a2 = $di->get('a2',array("小张"));echo $a2->name."
";//小张$a2_1 = $di->get('a2',array("小徐"));echo $a2->name."
";//小张echo $a2_1->name."
";//小徐$a3 = $di['a3'];//可以直接通过数组方式获取服务对象echo $a3->name."
";//小唐

通过set和setShared方式注册服务,支持 匿名函数,类名字符串,已经实例化的对象,两者的区别是:

set方式注册的,每次获取的时候都会重新实例化

setShared方式的,则只实例化一次,也就是所谓的单例模式

当然,对于直接注册已经实例化的对象,如上代码中的a3服务,set和setShared效果是一样的。

通过$di->get()获取服务,可接受两个参数,第一个参数是服务名,比如a1,a2,a3是必须的,第二个参数是一个数组,第二个参数会被当作匿名函数中的参数或者类构造函数里的参数传进去,参考call_user_func_array()。

删除服务则可以通过

unset($di['a1']);

or

$di->remove('a1');

判断是否包含一个服务可以通过

isset($di['a1']);

or

$di->has('a1');

就这么多了。

转载于:https://my.oschina.net/cxz001/blog/227482

你可能感兴趣的文章
findbugs eclipse 插件 及使用
查看>>
【微服务No.4】 API网关组件Ocelot+Consul
查看>>
微软以白金会员加入 OpenChain 开源组织
查看>>
windows下的套接字IO模型
查看>>
Session,cookie,localStorage
查看>>
Jenkins——持续集成服务器
查看>>
《利用Python进行数据分析·第2版》第12章 pandas高级应用
查看>>
[剑指offer] 二叉树的镜像
查看>>
ByteTCC 0.5.0-ALPHA1 发布,基于 TCC 的分布式事务管理器
查看>>
WPS Office 2019企业版全面升级,推出密级关键词和移动会议新功能
查看>>
【实操】如何安装及查看云监控
查看>>
企业上云之机房和BGP带宽篇(三)
查看>>
SEO优化:为什么要关注“网站抓取频率”?
查看>>
浅谈web接口测试
查看>>
Python——爬虫学习1
查看>>
智云大咖秀:怎样的稳定器才是摄影师的“灵魂辅助”?
查看>>
Android 学习之drawerlayout写侧滑菜单
查看>>
深度学习工程模板
查看>>
按钮点击效果总结
查看>>
从普通程序员到身价过百亿:追求长期价值的耐心,决定了你能走多远
查看>>