lumen-ioc容器测试 (1)

lumen-ioc容器测试 (1)

lumen-ioc容器测试 (2)

lumen-ioc容器测试 (3)

lumen-ioc容器测试 (4)

lumen-ioc容器测试 (5)

lumen-ioc容器测试 (6)

代码 

<?php



Class Ioc
{
	//设置全局的已经绑定过的
	private $set = [];

	// 存储已经解析对象
	private $parsed = [];


	public function set($name,$value)
	{
		$this->set[$name] = $value;
	}

	public function get($name){
		if(!isset($this->set[$name])){
			return false;
		}
		// 如果没有解析过 那就解析一下
		if(empty($this->parsed[$name])){
			$this->parsed[$name] = $this->set[$name](); // 用括号表示执行回调 才是对象
		}

		return $this->parsed[$name];
	}
}

$ioc = new Ioc();

$ioc->set("redis",function(){
	$redis = new Redis();
	$redis->connect("127.0.0.1",6379);
	return $redis;
});

$ioc->set("mysql",function(){
	$pdo = new PDO("mysql:host=127.0.0.1;", "root", "root");
	return $pdo;
});

$redis = $ioc->get("redis");
$mysql = $ioc->get("mysql");

echo "<hr>";
echo "<pre>";
echo "ioc容器打印<br>";
var_dump($ioc);

echo "<hr>";
echo "<pre>";
echo "两个资源打印<br>";
var_dump($redis);
var_dump($mysql);

echo "<hr>";
echo "<pre>";
echo "设置redis测试<br>";
$redis->set("name",'six');
var_dump($redis->get("name"));


echo "<hr>";
echo "<pre>";
echo "查看同时取出多个redis实例化了几个对象<br>";

var_dump($ioc->get("redis"));
var_dump($ioc->get("redis"));
var_dump($ioc->get("redis"));
var_dump($ioc->get("redis"));
var_dump($ioc->get("redis"));

  

这就是简单容器 其实就是把已经实例化好的对象绑定到某个对象的数组属性里面,要用的时候拿,避免重复实例化耗资源,

每次实例化要重新分配内存,建立上下文,如果是db 还得建立tcp握手等,反正就是能复用就复用 

看代码不像laravel lumen的容器 下面一片 优化下命名 

lumen-ioc容器测试 (2)

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