lumen-ioc容器测试 (5)
问题三,如果我们定义类构造函数的时候依赖其他的参数怎么办?
- # class Container# 复制上面的代码
- # testing
- class Person{
- private $name;
- private $isProgrammer;
- public function __construct($name,$isProgrammer = true) {
- $this->name = $name;
- $this->isProgrammer = $isProgrammer;
- }
- public function me() {
- $message = $this->isProgrammer ? ',Ta是一个程序员' :'';
- return "姓名: {$this->name} $message";
- }
- }
- $container = new Container();
- $container->bind('Person');
- $p1 = $container->make('Person',[
- 'name' => 'lilei',
- ]);
- echo $p1->me();
- # 这样看肯定是不行的,会报出错误
接下来继续解决问题
- class Container {
- private $bindings = [];
- private $instances = [];
- public function getClosure($concrete) {
- # 让闭包带参
- return function($parameter = []) use($concrete) {
- #将参数传递给具体的类、就算构造函数不需要参数这样写也不会有任何问题
- return new $concrete($parameter);
- };
- }
- public function bind($abstract , $concrete=null, $shared = false)
- {
- if (is_null($concrete)) {
- $concrete = $abstract;
- }
- if (!$concrete instanceof Closure) {
- $concrete = $this->getClosure($concrete);
- }
- $this->bindings[$abstract] = [
- 'concrete' => $concrete,
- 'shared' => $shared
- ];
- }
- # 在这里添加一个$paramters 参数
- public function make($abstract ,array $parameters = []) {
- if (!isset($this->bindings[$abstract])) {
- return false;
- }
- if (isset($this->instances[$abstract])) {
- return $this->instances[$abstract];
- }
- # 那么其实在这里处理一下就可以了
- # 需不需要参数?到底需不需要参数我们不知道
- # 因为$this->bindings[$abstract]['concrete'] 是一个闭包函数
- $concrete = $this->bindings[$abstract]['concrete'];
- #$concrete($parameters) 相当于使用getClosure中闭包函数;
- # $concrete = function() use($concrete1) {
- // return new $concrete1;
- // };
- # 如果想传递一个参数给闭包那么应该修改一下getClosure方法,让闭包方法带参
- $object = $concrete($parameters);
- if($this->bindings[$abstract]['shared']) {
- $this->instances[$abstract] = $object;
- }
- return $object;
- }
- }
- #testing
- class Person{
- private $name;
- public function __construct($param) {
- $this->name = $param['name'] ?? 'unknown';
- }
- public function getName() {
- return $this->name;
- }
- }
虽然看起来解决了带参问题,但是问题很明显。我们给构造函数传递的参数是一个数组,我们无法做到让每个人写的插件都把构造函数写成这样。透明性并不好。
lumen-ioc容器测试 (5)的更多相关文章
- 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 ...
随机推荐
- Git 实用基础(配置,建库,提交,推送 GitHub)
Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...
- 教务管理系统(node+express+mysql)
模块拆分 现在将教务系统拆分成九个模块: 教务系统教师业务:师资管理.教学计划管理.排课管理 教务系统学生业务:考试管理.毕业生管理.学生综合测评 信息查询:自习室查询.课程表查询 考试系统:实现学生 ...
- Jack Straws(POJ 1127)
原题如下: Jack Straws Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5555 Accepted: 2536 ...
- element ui 分页记忆checked
<el-table :data="tableData" border ref="multipleTableChannel" @selection-chan ...
- java安全编码指南之:字符串和编码
目录 简介 使用变长编码的不完全字符来创建字符串 char不能表示所有的Unicode 注意Locale的使用 文件读写中的编码格式 不要将非字符数据编码为字符串 简介 字符串是我们日常编码过程中使用 ...
- Java面试知识点1
typora-root-url: ......\Software\Typora\Picture Bean的作用域 在Spring的元素的scope属性设置bean的作用域,用来决定bean是单实例还是 ...
- 记tp5.1使用composer PhpOffice的xlsx表格文件导入数据库
在项目环境下composer require phpoffice/phpspreadsheet在项目中引用use PhpOffice\PhpSpreadsheet\IOFactory; 下面是 上传x ...
- 使用U盘的PE系统安装Windows10操作系统 - 初学者系列 - 学习者系列文章
今天闲来无事,就把windows 10的安装再重写一个文(以前写过一个:安装免费的正版Windows10操作系统 - 初学者系列 - 学习者系列文章 ). 1. 制作一个WinPE的U盘. 相信现 ...
- Mock简明文档
Mock简明文档 Mock.mock() Mock.mock( requestUrl?, requestType?, template|function(options) ) Mock.mock( t ...
- 解析nohup java -jar xxx &
一直就知道 java -jar xx ctrl+c就退出了 来自这个文 https://blog.csdn.net/wngpenghao/article/details/83022185 java - ...