DI(Dependency Injection)即为依赖注入,依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的 协作对象
IOC(Inversion of Control)叫控制反转。不是什么技术,而是一种设计思想。Ioc意味着将你设计好的对象 交给容器控制,而不是传统的在你的对象内部直接控制
DI:在程序运行的过程中,动态的向某个对象提供他所需要的其他对象
IOC:容器最终在程序中(被实例化)体现为 app(应用), 所以不管你需要什么以及绑定的功能模块。例如:菜鸟裹裹相当于是IOC容器,每个快递公司就是服务提供者,快递运输还是由每个快递公司来完成不是由菜 鸟裹裹来做,绑定就相当于快递公司入驻签订协议。服务是由服务提供者提供使用,容器只是管理服务的。
其实,在laravel框架中,Ioc可以理解为一个数组,在这个数组中,key就是绑定类的名称,value就是对应的类
$ioc=[ "app"=>"Application::class" ]解析过程的话首先找到key,找到了这个关键的“钥匙”,反射出我们需要的类 代码解释——依赖注入 我们创建一个支付方式,规定只能腾讯旗下的才可以支付
class PayType { private $t; public function __construct(TengXun $tengxun) { $this->t = $tengxun; } public function pay() { return "只能使用腾讯旗下支付方式"; } } interface TengXun{ // 统一的支付公司 } class Wx implements TengXun{ //微信支付继承了“腾讯”,那么就可以使用这个方式支付 } $wx = new Wx(); $prepay = new PayType($wx); echo $prepay->pay();运行结果: 如果使用京东支付,没有继承“腾讯”,那么自然就不能支付(运行)
$jd = new JD(); $prepay = new PayType($jd); echo $prepay->pay();运行结果:
代码解释——Ioc容器
$pay_Company = new payCompany(); $pay_Company->set('wx',function(){ return new Wx(); }); $pay_Company->set('payType',function()use($pay_Company){ return new PayType($pay_Company->get('wx')); }); echo $pay_Company->get('payType')->pay();这里的payCompany支付公司相当于Ioc容器,我们要将所有的支付方式都注入里面,然后才能支付。 先将"微信支付"注册到这个公司。这里第二个参数用闭包函数(在laravel中很常见) 再将统一的名词“支付方式”注入到“公司” 顾客想要付款的时候,通过“支付方式"这个动作调起想要的微信支付。
个人理解,欢迎补充(▽)
