laravel容器container 阅读记录

今天抽时间又仔细看了一下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列表,就可以直接替换内容,方便测试。

时间: 2024-11-05 16:41:14

laravel容器container 阅读记录的相关文章

x264阅读记录-3

14. x264_macroblock_encode函数-1 这个函数主要根据已经选定的模式来对宏块残差进行编码. (1)如果是P_SKIP模式,那么调用x264_macroblock_encode_pskip函数 在x264_macroblock_encode_pskip中先对亮度和色度进行运动补偿,调用的函数函数h->mc.mc_luma和 h->mc.mc_chroma.这两个是函数指针,根据需要对其进行初始化.一般常用的是函数mc_luma, 在mc.c文件中.在mc_luma中如果存

Android源码AOSP之设置Settings阅读记录

Android 4.4 系统的设置源码阅读记录 ----------2014-7-3------------------ AndroidManifest.xml launch的activity是 Settings,另外有40多个activity继承于它,比如设置的一级菜单: wifi,蓝牙,声音,显示,安全,应用程序,语言和时间,关于设备等等.实际上都是这一个acitivy. 这里从安全设置看起,SecuritySettings.java 以资源文件R.xml.security_settings

linux0.11 源代码阅读记录

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

C++ - 容器(container)的erase()函数

容器(container)的erase()函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23996013 容器(container)的erase()函数, 是删除一个元素, 会移动迭代器的指针, 指向下一个元素; 迭代器(iterator)是一种指针, 赋值是传递的地址, 指向同样的元素; 代码: /* * test.cpp * * Created on: 2014.04.18 * Author: Spike */ /*

C++ - 复制容器(container)的元素至另一个容器

复制容器(container)的元素至另一个容器 本文地址: http://blog.csdn.net/caroline_wendy C++复制容器(container)元素, 可以使用标准库(STL)的copy()和copy_n()函数. 函数样式: OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result) 代码: /* * main.cpp * * Created on: 2014

C++ - 使用copy函数打印容器(container)元素

使用copy函数打印容器(container)元素 本文地址: http://blog.csdn.net/caroline_wendy C++可以使用copy函数输出容器(container)中的元素, 可以代替for循环. 头文件:  #include <algorithm> #include <iterator> 格式:  std::copy(cont.begin(), cont.end(),std::ostream_iterator<Type>(std::cout

NRE代码阅读记录

本来是为了论证自己的观点,把安全标签打在RunningConfig里,就写了个代码分析,结果写着写着发现的确不应该是在RunningVM里.意外的发现看代码的时候这么写写还是挺不错的,也避免了看了后面的忘记前面的.这种底层的代码实在是很难理解,对我来说就像是小学生去算高数一样,也只能硬着头皮去看了. vmmng.cc对应的就是如下界面(回头放图上来,ubuntu下没有什么截图工具,总不能把整个屏幕放上来)然后"3"键可以新建tiny-core虚拟机,对应到代码里,也就是input_th

通过ssh方式登陆Docker容器的操作记录

前面几篇已经介绍了Docker基础环境的部署,下面介绍下通过ssh方式登陆Docker容器的操作记录 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos7 7.3.1611 d5ebea14da54 2 weeks ago 311 MB <none> <none> d5c154b612c8 2 weeks ago 311 MB test latest ecefde07358

《Javascript高级程序设计》阅读记录(三):第五章 上

这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅读 另一个目的是,Javascript高级程序设计这本书内容很多也很厚,希望其他没有时间的人可以通过看这系列摘录,就可以大体学到书里面的核