今天抽时间又仔细看了一下laravel的container,记录一下。

所谓容器,听名字就知道,是一个仓库,装东西用的,所以,container所有的功能,都围绕一个主题:管理装。

类名称:Illuminate\Container\Container

首先,生成一个数组绑定列表,用自定义名称作为主键,然后键值是闭包(输入的可能是闭包或者实体类,但是,在存储的时候,都统一转化成了闭包存储)。

其次,根据绑定列表,生成对应的类的实例,供用户使用,调用的时候,发现如果已经生成,不需要重新生成使用,实际上,就是类的一个仓库,以及缓存。

绑定列表,分两种:

  1. 接口或者类 对应类或者闭包 存储在bindings
  2. 别名 对应类或者接口 存储在aliases abstractAliases  (分别用别名对实际内容 /实际内容对别名两种方式存储别名,注意,第二个可以是多维数组,代表,一个类或者接口,只能有一个别名,但是,一个别名肯能对多个类或者接口

内部实际数据存储用的变量:$bindings,$instances,$aliases,$resolved

$bindings  每个调用对应的实现方法,要想自动实现,这个是必须的

$instances  所有共享类,已经生成的实例化的类,都存储在这里,所谓共享,实际上就是唯一类,系统运行过程中,如果发现这个类已经实例化,那么就直接调用,不用重新生成

$aliases  别名,存储了每个类或者接口对应的别名,这个别名应该在bindings里面能找到,否则,在实例化的时候会报错。

核心操作:bind/build /resolve /make/instance

容器的使用:

所以,一个容器有如下用法:

1. 首先添加一个绑定的列表,之后要实例化类的时候,不使用new实例化,而是,调用容器的make,这样的话,所有类的实例化和使用,都就由容器管理起来了。

2. 直接new一个对象,然后,调用instance,添加到容器中,这样,下一次别到地方用到这个类的时候,就不用重新实例化,实现了实例的唯一。

容器的好处:

1. 减少内存的使用吧,一个http请求的过程中,其实很多时候需要的数据,都是一样的,一个类new了多次,比较容易造成内存的浪费。

2. 容器贯穿始终,调用起来比较方便。

3. 每个类的生成都是通过binding列表来的话,那么就比较容易替换,只要是同一接口,替换binding列表,就可以直接替换内容,方便测试。

最新文章

  1. 前端开发--ppt展示页面跳转逻辑实现
  2. Android重写菜单增加系统自带返回键
  3. 比CMD更强大的命令行WMIC
  4. Java项目:学生成绩管理系统(二)
  5. 浅谈c语言的指针
  6. According to TLD or attribute directive in tag file, attribute end does not accept any expressions
  7. [deviceone开发]-do_FrameAnimtionView的简单动画示例
  8. [Scheme]一个Scheme的Metacircular evaluator
  9. poj 1833
  10. combox源码解析
  11. Mysql笔记——DQL
  12. js中Math()函数&&数据类型转换
  13. Day07 - Python 网络编程 Socket
  14. ecshop 模板与库文件lbi
  15. Java 坦克小游戏心得
  16. asp.net mvc 客户端(&)中检测到有潜在危险的 Request.Path 值。
  17. Github超棒资源汇总
  18. Linux内核剖析(三)构建源码树
  19. Dijkstra及其堆优化
  20. NPM常用命令install 淘宝镜像 update等

热门文章

  1. What is a TensorFlow Session?
  2. MyBatis 配置多数据源
  3. SQL server 在附加数据库后,数据库总是变成了只读
  4. Golang 笔记 5 go语句
  5. pymysql操作mysql
  6. css特效 - 环形文字
  7. 解决FAT32格式U盘安装win10时0x8007000D错误
  8. js如何获取字符串第几次出现的位置
  9. java课程课后作业04之动手动脑
  10. Win10上使用VS2015编译Caffe2