lumen-ioc容器测试 (4)
问题二,这个其实也不算问题,就是写法上的优化,我们是不是每次都要传递第二个参数并且每次都要写一个闭包进去?
# class Container# 复制上面的代码
class Person{
public $name;
}
$container = new Container();
$container->bind('person' , function(){
return new Person();
},true);
我们来分析一下,实际上我已经知道了Person类,那么我们能不能想下面代码中的这么实现呢
...
$container = new Container();
$container->bind('Person' , 'Person' , true);
$container->bind('Person');
...
接下来继续改进
class Container {
private $bindings = [];
private $instances = [];
#这里是生成闭包的地方
public function getClosure($concrete) {
return function() use($concrete) {
return new $concrete;
};
}
public function bind($abstract , $concrete=null, $shared = false)
{
if (is_null($concrete)) {
$concrete = $abstract;
}
# 如果$concrete 不是一个闭包生成一个闭包
if (!$concrete instanceof Closure) {
$concrete = $this->getClosure($concrete);
}
$this->bindings[$abstract] = [
'concrete' => $concrete,
'shared' => $shared
];
}
public function make($abstract) {
if (!isset($this->bindings[$abstract])) {
return false;
}
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
$object = $this->bindings[$abstract]['concrete']();
if($this->bindings[$abstract]['shared']) {
$this->instances[$abstract] = $object;
}
return $object;
}
}
class Person{
public $name;
}
# testing
$container = new Container();
$container->bind('Person' , 'Person' , false);
$p1 = $container->make('Person');
$p2 = $container->make('Person');
var_dump($p1 , $p2 , $p1 === $p2);
$c1 = new Container();
$c1->bind('Person');
$p3 = $c1->make('Person');
$p4 = $c1->make('Person');
var_dump($p3 , $p4 , $p3 === $p4);
$c2 = new Container();
$c2->bind('Person','Person', true);
$p5 = $c2->make('Person');
$p6 = $c2->make('Person');
var_dump($p5 , $p6 , $p5 === $p6);
入门我们自己写这个container大部门人会在make里去判断是否是一个闭包,写完就不再优化了...
lumen-ioc容器测试 (4)的更多相关文章
- lumen-ioc容器测试 (1)
lumen-ioc容器测试 (1) lumen-ioc容器测试 (2) lumen-ioc容器测试 (3) lumen-ioc容器测试 (4) lumen-ioc容器测试 (5) lumen-ioc容 ...
- 自定义模拟一个Spring IOC容器
一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...
- Aoite 系列(02) - 超动感的 Ioc 容器
Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...
- AutoFac使用~IOC容器(DIP,IOC,DI)
#cnblogs_post_body h1 { background-color: #A5A5A5; color: white; padding: 5px } Autofac一款IOC容器,据说比Sp ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解
1.概述 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模 ...
- IOC容器中bean的生命周期
一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- TypeC一个微软开发的超简单.NET依赖注入/IoC容器
控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...
- IoC 之 2.2 IoC 容器基本原理(贰)
2.2.1 IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC ...
随机推荐
- [LeetCode] 448. 找到所有数组中消失的数字(思维)
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...
- WeihanLi.Npoi 1.10.0 更新日志
WeihanLi.Npoi 1.10.0 更新日志 Intro 上周有个网友希望能够导入Excel时提供一个 EndRowIndex 来自己控制结束行和根据字段过滤的,周末找时间做了一下这个 feat ...
- Hadoop入门学习整理(三)
1.Hive 的安装 下载tar包,并且要注意和Hadoop版本兼容. 下载 -----> 传输 -------> 解压 即可. 然后配置环境变量和相关配置信息. 参考: ...
- Docker跨主机通信(九)
容器网络 在前面的博客中已经详细讲解了几种网络方案: none, host, bridge,user-defined.但是他们只是解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信.本 ...
- Vue 登录/登出以及JWT认证
1. 后端代码概览 server/router/index.js 请求 router.get('/getUserInfo', function (req, res, next) { // 登录请求 r ...
- python中RGB色彩
turtle.colormode(mode)来改变色彩数值的使用 如果在修改颜色时写turtle.colormode(1.0) ,就需要使用RGB小数模式来去改变颜色 如果在修改颜色时写turtle. ...
- CAS导致的ABA问题以及解决方案
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化. 上篇文章讲到CAS会出现一个ABA问题.那什么是ABA问题呢? 官方一点的解释就是:当 ...
- 【域控日志分析篇】CVE-2020-1472-微软NetLogon权限提升-执行Exp后域控日志分析与事件ID抓取
前言:漏洞复现篇见:https://www.cnblogs.com/huaflwr/p/13697044.html 本文承接上一篇,简单过滤NetLogon漏洞被利用后,域控上的安全及系统日志上可能需 ...
- 吴恩达-机器学习+Logistic回归分类方案
- python的快捷键
常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标 2.Shift + Enter:在下方新建行并移到新行行首 3.Ctrl + /:注释(取消注释)选择的行 4.Ctrl + Alt ...