lumen-ioc容器测试 (1)

lumen-ioc容器测试 (2)

lumen-ioc容器测试 (3)

lumen-ioc容器测试 (4)

lumen-ioc容器测试 (5)

lumen-ioc容器测试 (6)

问题三,如果我们定义类构造函数的时候依赖其他的参数怎么办?

  1. # class Container# 复制上面的代码
  2.  
  3. # testing
  4. class Person{
  5. private $name;
  6. private $isProgrammer;
  7. public function __construct($name,$isProgrammer = true) {
  8. $this->name = $name;
  9. $this->isProgrammer = $isProgrammer;
  10. }
  11.  
  12. public function me() {
  13. $message = $this->isProgrammer ? ',Ta是一个程序员' :'';
  14. return "姓名: {$this->name} $message";
  15. }
  16. }
  17. $container = new Container();
  18. $container->bind('Person');
  19. $p1 = $container->make('Person',[
  20. 'name' => 'lilei',
  21. ]);
  22.  
  23. echo $p1->me();
  24.  
  25. # 这样看肯定是不行的,会报出错误

  

接下来继续解决问题

  1. class Container {
  2.  
  3. private $bindings = [];
  4.  
  5. private $instances = [];
  6.  
  7. public function getClosure($concrete) {
  8. # 让闭包带参
  9. return function($parameter = []) use($concrete) {
  10. #将参数传递给具体的类、就算构造函数不需要参数这样写也不会有任何问题
  11. return new $concrete($parameter);
  12. };
  13. }
  14.  
  15. public function bind($abstract , $concrete=null, $shared = false)
  16. {
  17. if (is_null($concrete)) {
  18. $concrete = $abstract;
  19. }
  20.  
  21. if (!$concrete instanceof Closure) {
  22. $concrete = $this->getClosure($concrete);
  23. }
  24.  
  25. $this->bindings[$abstract] = [
  26. 'concrete' => $concrete,
  27. 'shared' => $shared
  28. ];
  29. }
  30.  
  31. # 在这里添加一个$paramters 参数
  32. public function make($abstract ,array $parameters = []) {
  33. if (!isset($this->bindings[$abstract])) {
  34. return false;
  35. }
  36.  
  37. if (isset($this->instances[$abstract])) {
  38. return $this->instances[$abstract];
  39. }
  40.  
  41. # 那么其实在这里处理一下就可以了
  42. # 需不需要参数?到底需不需要参数我们不知道
  43. # 因为$this->bindings[$abstract]['concrete'] 是一个闭包函数
  44. $concrete = $this->bindings[$abstract]['concrete'];
  45. #$concrete($parameters) 相当于使用getClosure中闭包函数;
  46. # $concrete = function() use($concrete1) {
  47. // return new $concrete1;
  48. // };
  49. # 如果想传递一个参数给闭包那么应该修改一下getClosure方法,让闭包方法带参
  50. $object = $concrete($parameters);
  51. if($this->bindings[$abstract]['shared']) {
  52. $this->instances[$abstract] = $object;
  53. }
  54.  
  55. return $object;
  56. }
  57. }
  58.  
  59. #testing
  60. class Person{
  61. private $name;
  62. public function __construct($param) {
  63. $this->name = $param['name'] ?? 'unknown';
  64. }
  65.  
  66. public function getName() {
  67. return $this->name;
  68. }
  69. }

  

虽然看起来解决了带参问题,但是问题很明显。我们给构造函数传递的参数是一个数组,我们无法做到让每个人写的插件都把构造函数写成这样。透明性并不好。

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

  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. Git 实用基础(配置,建库,提交,推送 GitHub)

    Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...

  2. 教务管理系统(node+express+mysql)

    模块拆分 现在将教务系统拆分成九个模块: 教务系统教师业务:师资管理.教学计划管理.排课管理 教务系统学生业务:考试管理.毕业生管理.学生综合测评 信息查询:自习室查询.课程表查询 考试系统:实现学生 ...

  3. Jack Straws(POJ 1127)

    原题如下: Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5555   Accepted: 2536 ...

  4. element ui 分页记忆checked

    <el-table :data="tableData" border ref="multipleTableChannel" @selection-chan ...

  5. java安全编码指南之:字符串和编码

    目录 简介 使用变长编码的不完全字符来创建字符串 char不能表示所有的Unicode 注意Locale的使用 文件读写中的编码格式 不要将非字符数据编码为字符串 简介 字符串是我们日常编码过程中使用 ...

  6. Java面试知识点1

    typora-root-url: ......\Software\Typora\Picture Bean的作用域 在Spring的元素的scope属性设置bean的作用域,用来决定bean是单实例还是 ...

  7. 记tp5.1使用composer PhpOffice的xlsx表格文件导入数据库

    在项目环境下composer require phpoffice/phpspreadsheet在项目中引用use PhpOffice\PhpSpreadsheet\IOFactory; 下面是 上传x ...

  8. 使用U盘的PE系统安装Windows10操作系统 - 初学者系列 - 学习者系列文章

    今天闲来无事,就把windows 10的安装再重写一个文(以前写过一个:安装免费的正版Windows10操作系统 - 初学者系列 - 学习者系列文章  ). 1.  制作一个WinPE的U盘. 相信现 ...

  9. Mock简明文档

    Mock简明文档 Mock.mock() Mock.mock( requestUrl?, requestType?, template|function(options) ) Mock.mock( t ...

  10. 解析nohup java -jar xxx &

    一直就知道 java -jar xx ctrl+c就退出了 来自这个文 https://blog.csdn.net/wngpenghao/article/details/83022185 java - ...