lumen-ioc容器测试 (1)

lumen-ioc容器测试 (2)

lumen-ioc容器测试 (3)

lumen-ioc容器测试 (4)

lumen-ioc容器测试 (5)

lumen-ioc容器测试 (6)

接上篇

问题一,如果想通过同一个类名,获取不同的对象,而不是单例对象怎么办?

// 省略的上篇容器代码 

class Person
{
public $name;
} $container = new Container(); $container->bind("person",function(){
return new Person();
}); $zhangsan = $container->make("person");
$zhangsan->name = "zhangsan"; $lisi = $container->make("person");
$lisi->name = "lisi"; echo $zhangsan->name."<br>";
echo $lisi->name."<br>";

//结果
lisi
lisi

  

如何解决 可以设置一个shared的参数 绑定的时候,如果是真 那么表示要共享,就存储到已解析数组里面 否则不存

<?php

class Container
{
// 调用bind方法绑定过的对象
private $bindings = []; // 执行了bind并且执行了回调 存储的是实例化过的对象 可以直接使用
private $instance = []; /**
* 绑定
* @param $abstract bind的名称
* @param $concrete 回调
*/
public function bind($abstract, $concrete, $shared = false)
{
$this->bindings[$abstract] = [
'concrete' => $concrete,
'shared'=> $shared
];
} /**
* 根据绑定名称 获取实例
* @param $abstract 名称
*/
public function make($abstract)
{
if(!isset($this->bindings[$abstract])){
throw new \Exception($abstract." 未绑定到容器");
} if(isset($this->instance[$abstract])){
return $this->instance[$abstract];
} $obj = $this->bindings[$abstract]['concrete']();
// 如果需要共享 那么才存进容器已经解析里面
if($this->bindings[$abstract]['shared']){
$this->instance[$abstract] = $obj;
}
return $obj;
}
} class Person
{
public $name;
} $container = new Container(); // 第二个是否共享参数false表示不共享 每次都新实例化对象
$container->bind("person",function(){
return new Person();
}); $zhangsan = $container->make("person");
$zhangsan->name = "zhangsan"; $lisi = $container->make("person");
$lisi->name = "lisi"; echo $zhangsan->name; // zhangsan
echo $lisi->name; // lisi
var_dump($zhangsan); // object(Person)#3 (1) { ["name"]=> string(8) "zhangsan" }
var_dump($lisi); // object(Person)#4 (1) { ["name"]=> string(4) "lisi" }

  

lumen-ioc容器测试 (3)的更多相关文章

  1. lumen-ioc容器测试 (1)

    lumen-ioc容器测试 (1) lumen-ioc容器测试 (2) lumen-ioc容器测试 (3) lumen-ioc容器测试 (4) lumen-ioc容器测试 (5) lumen-ioc容 ...

  2. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  3. Aoite 系列(02) - 超动感的 Ioc 容器

    Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...

  4. AutoFac使用~IOC容器(DIP,IOC,DI)

    #cnblogs_post_body h1 { background-color: #A5A5A5; color: white; padding: 5px } Autofac一款IOC容器,据说比Sp ...

  5. IOC容器特性注入第一篇:程序集反射查找

    学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...

  6. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解

    1.概述 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模 ...

  7. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  8. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  9. TypeC一个微软开发的超简单.NET依赖注入/IoC容器

    控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...

  10. IoC 之 2.2 IoC 容器基本原理(贰)

    2.2.1  IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC ...

随机推荐

  1. 单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)

    一.定义 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果 ...

  2. 安卓自动化测试工具Monkey简单使用

    一.首先安装adb 地址:http://www.downza.cn/soft/219906.html安装到D盘下,安装的过程中自己注意下不要安装上全家桶.找到这个压缩包:解压到当前文件夹: 二.将ad ...

  3. Java面试必问之-JUC

    JUC:java.util.concurrent (Java并发编程工具类) 代码:D:\JAVA\Java_Learning\Elipse_Project\workspace200301EE\JUC ...

  4. 使用wordpress搭建的一个微信小程序

  5. 处理IOS浏览器在input或者textarea获取焦点后底部留一块灰色空白区域的bug

    document.body.addEventListener('focusout',function() { window.scrollTo(0,0) },false);

  6. 第3章 01 python数字类型即操作

    浮点数类型 通过round函数比较浮点数之间的比较关系 复数类型 数值运算函数 小结 天天向上的力量 千分之一的力量 千分之五和百分之一的力量 在1的基础上增加天天向上的参数 在1的基础上减去天天向下 ...

  7. 【Unity 插件】Lean Pool 使用

    2020-09-11 Lean Pool 是一个轻量级的游戏对象池库,它可以轻松的帮助你的游戏提高性能.当然,Lean Pool也可以工作于普通的C#类. 目录: 1.Lean Pool使用 2.Le ...

  8. Spring属性注入(set方式、构造函数方式、p名称空间、spel、复杂类型)

    1.set注入方式 (1)注入的为值类型(八大数据类型)的数据 配置文件: <?xml version="1.0" encoding="UTF-8"?&g ...

  9. 超详细的 Vagrant 上手指南

    搭建 Linux 虚拟机,别再用 VirtualBox 从 .iso 文件安装了. 概述 2020 年了,也许你已经习惯了 docker,习惯了在 XX 云上快速创建云主机,但是如果你想在个人电脑上安 ...

  10. mybatis动态条件组合分页查询

    一.动态条件处理 需要使用mybatis的动态sql 1 <select id="selectItemByCondition" parameterType="com ...