pimple学习:源码解读
个人理解,请轻拍233
1.对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方法中,通过接口传递参数,体现了面向对象编程中的 面向接口编程原则。同时
通过组合实现容器的扩展。