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