【看完就懂】Laravel 服务容器,IoC,DI 阅读笔记
个人理解:
容器 依赖注入(DI) 控制反转(IoC) 最终实现
通过容器来生成 类 类的依赖 通过 外部传入容器 来扩展和实现 类功能 在 类的内部通过统一方法调用 来使用不同的功能
原文地址:https://learnku.com/articles/19195
其他参考:https://www.insp.top/learn-laravel-container
朋友推荐的资料:https://zhuanlan.zhihu.com/p/33492169
<?php /* */ //容器类 class Container { protected $binds; protected $instances; public function bind($abstract, $concrete) { // $abstract 方法名称 // var_dump($abstract); // $concrete 对象本体 // var_dump($concrete); //判断是否来自于 Closure(闭包类) 接口 if ($concrete instanceof Closure) { //是闭包放入 $binds $this->binds[$abstract] = $concrete; } else { //不是闭包放入 $instances $this->instances[$abstract] = $concrete; } if($abstract == \'Computer\'){ // var_dump($abstract); // var_dump($concrete); // 这里并没有接收到 $module 显然 $module 不是在这里用的 // var_dump($module); } } public function make($abstract, $parameters = []) { //这里判断 外部传入的对象是否存在 存在返回 外部传入的对象 //用于判断是否是之前传入的闭包 不是闭包则返回 之前传入的对象 if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } //不存在 //array_unshift 在数组开头插入一个或多个单元 //将对象$this 插入 $parameters 的头部 作为闭包类的 参一 这里做参数拼接 array_unshift($parameters, $this); // var_dump($parameters);die; //调用 闭包方法 $abstract 传入 参数$parameters //主要用于创建闭包 传入的对象 return call_user_func_array($this->binds[$abstract], $parameters); } } //Computer类(测试用) class Computer{ private $CommonBoard; public function __construct($obj) { //这里拿到了共用键盘对象 $this->CommonBoard = $obj; echo \'<hr>Computer中得到Board对象\'; var_dump($this->CommonBoard); echo \'<hr>\'; } public function startingUp(){ echo \'<hr>Computer中使用CommonBoard对象\'; //调用CommonBoard 类中的test 方法 var_dump($this->CommonBoard); $this->CommonBoard->test(); echo \'<hr>Hello world\'; echo \'<hr>\'; } } //公用键盘类(测试用) class CommonBoard{ public function __construct() { //公用的初始化设置 echo \'<hr>实例化CommonBoard对象<hr>\'; } //键盘类公用方法 public function test(){ echo \'<hr>使用原有键盘功能<hr>\'; } } //ikbc键盘(测试用) class mechanicalKeyboard extends CommonBoard{ public function test(){ echo \'<hr>使用机械键盘\'; $this->lightUp(); echo \'<hr>\'; } // private function lightUp() { echo \'<br>开灯\'; } } $container = new Container; $container->bind(\'Board\', function($container){ return new CommonBoard; }); //$container 即 array_unshift($parameters, $this); 这里存入的 //$module 后面调用出传入 // $container->bind(\'Computer\',function($container,$module){ // var_dump($container); // var_dump($module); // die; // 这里就可以传入 任意需要传入的对象 return new Computer($container->make($module)); }); //实例化 这里就拿到了一个 之前传入的公用键盘类的 Computer类(生成带有原有键盘的电脑) $computer = $container->make(\'Computer\',[\'Board\']); $computer->startingUp(); $obj = new mechanicalKeyboard; //注册 $container->bind(\'mechanicalKeyboard\',$obj); //生成带有mechanicalKeyboard的电脑 $computer = $container->make(\'Computer\',[\'mechanicalKeyboard\']); $computer->startingUp(); ?>