zoukankan      html  css  js  c++  java
  • lumen-ioc容器测试 (2)

    lumen-ioc容器测试 (1)

    lumen-ioc容器测试 (2)

    lumen-ioc容器测试 (3)

    lumen-ioc容器测试 (4)

    lumen-ioc容器测试 (5)

    lumen-ioc容器测试 (6)

    如果第一次看Laravel 、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容器。

  • 相关阅读:
    Qt中实现单例模式(SingleTon)
    毕设开发手记(二)
    Qt中由表中单元格的QModelIndex获取Global Pos的正确方法
    Qt的槽可以使用默认参数
    C#结构的了解
    dos命令集江南技术联盟
    C#中的abstract与virtual的用法
    [转]六种删除数据库重复行的方法
    PL/SQL的TO_CHAR()与TO_DATE()
    索引索引索引(转)
  • 原文地址:https://www.cnblogs.com/brady-wang/p/13733823.html
Copyright © 2011-2022 走看看