lumen-ioc容器测试 (2)
如果第一次看Laravel 、Lumen的容器源码可能会被里面的变量名搞的比较迷糊、毕竟很多人英文底子不是很好。
为了解决这个问题咱们简单装饰一下刚才的简单容器、可以初步了解lumen的容器中几个属性名的含义。
为了解决这个问题咱们简单装饰一下刚才的简单容器、可以初步了解lumen的容器中几个属性名的含义。
<?php class Container { // 调用bind方法绑定过的对象 private $bindings = []; // 执行了bind并且执行了回调 存储的是实例化过的对象 可以直接使用 private $instance = []; /** * 绑定 * @param $abstract bind的名称 * @param $concrete 回调 */ public function bind($abstract, $concrete) { $this->bindings[$abstract] = $concrete; } /** * 根据绑定名称 获取实例 * @param $abstract 名称 */ public function make($abstract) { if(!isset($this->bindings[$abstract])){ throw new \Exception($abstract." 未绑定到容器"); } // 如果该对象不在数组 那么实例化他 if(empty($this->instance[$abstract])){ $this->instance[$abstract] = $this->bindings[$abstract](); } return $this->instance[$abstract]; } } $container = new Container(); $container->bind('redis',function(){ $redis = new Redis(); $redis->connect("127.0.0.1",6379); return $redis; }); $container->bind('mysql',function(){ $pdo = new PDO("mysql:host=127.0.0.1;", "root", "root"); return $pdo; }); echo "<pre>"; var_dump($container->make("redis")); var_dump($container->make("redis")); var_dump($container->make("redis")); var_dump($container->make("mysql")); var_dump($container->make("mysql")); var_dump($container->make("mysql")); var_dump($container->make("mysql")); $redis = $container->make("redis"); echo $redis->get("name");
结果
object(Redis)#4 (0) { } object(Redis)#4 (0) { } object(Redis)#4 (0) { } object(PDO)#5 (0) { } object(PDO)#5 (0) { } object(PDO)#5 (0) { } object(PDO)#5 (0) { } six
说明每次执行的都是取自容器里面的对象
是不是满满的逼格?
任何项目或者事情都是先做出来一个小雏形,在其基础上针对已有的问题做优化、升级;
那么我们现在就开始找问题,并且升级吧。带你一步步实现lumen容器。