代码
<?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的容器 下面一片 优化下命名