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容器。

原文地址:https://www.cnblogs.com/brady-wang/p/13733823.html