pimple学习:源码解读
2016-07-28 19:56
387 查看
pimple学习:源码解读
个人理解,请轻拍2331.对Container类的解读
Container类继承一个php数组对象接口,在程序整个生命周期中,各种属性、方法、对象、闭包都可以注册其中。这体现出了面向对象编程中的依赖注入(控制反转)的法则,以消减对象间的耦合程度。
Container的成员变量:
values:存储需要注入的对象
factories: SplObjectStorage类型,存储对象
protected: SplObjectStorage类型
frozen:存储被冻结的对象
raw: 存储方法
keys:存储values中的key值(bool)
理解:
values 和factory的区别: 每次从values得到的都是同一个实例,从factory得到的是不同的实例。factory存的是构建实例的方法。
protected:用来存储匿名方法
Container的成员方法:
构造函数:
offsetSet:根据传入的id名和对象,若未被冻结,则存储在values 和 keys中
offsetGet:根据传入的id的值,返回存储在values中的对象
offsetExists:根据传入的id值,判断是否该对象已经存在
offsetUnset:根据传入的id值,移除存储的对象
factory: 将传入的callable回调函数保存到factory中(先判断是否有__invoke()方法,确保其闭包),返回通过的回调函数
protect:将传入的callable回调函数保存到protected中(先判断是否有__invoke()方法,确保其闭包)返回通过的回调函数
raw:根据传入的id,如果keys中不存在id,抛出异常,否则如果row中存在id键值的对象,返回该对象,否则返回values中存储的对象
extend:根据传入的id 和 回调函数 ,如果id不存在,回调函数不是对象或闭包,values[id]中的值不是对象或闭包,则抛出异常。移除原有对象,添加修改后的对象
keys:返回values中的所有key值
register:注册方法
理解:
extend函数的作用: 修改已经被保存的service。
特点:
Container类继承php数组对象接口,所以在注册的时候可以这样
$container['session_storage'] = function ($c) { return new SessionStorage('SESSION_ID'); };
设计模式:
factory()方法 像简单工厂模式,存着产生实例的方法,通过调用相应的方法得到实例。
在rigister方法中,通过接口传递参数,体现了面向对象编程中的 面向接口编程原则。同时
通过组合实现容器的扩展。
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- 关于浮动与清除浮动,你应该知道的
- 数组reduce方法的高级技巧
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站