Skip to content

Latest commit

 

History

History
72 lines (63 loc) · 1.69 KB

服务容器.md

File metadata and controls

72 lines (63 loc) · 1.69 KB

服务容器

通俗的讲,服务容器就是许多服务存放的地方。

通常一个容器具有绑定和解析两个操作:

  • 绑定,指的是将获取服务对象的方法在容器中进行注册。相当于把服务装入到容器中。
  • 解析,指的是将绑定到容器中的服务从容器中提取出来,注意通常我们绑定的不是对象本身,而是生成对象的代码,一次解析时通常是执行代码来得到对象。
# 1, 服务容器定义
/**
 * Class Application
 * 服务容器类,类名参考Laravel
 */
class Application
{
//    已绑定(注册)的服务
    private $services = [];

    /**
     * 绑定(注册)
     * @param $class string
     * @param $generator Closure
     */
    public function bind($class, $generator)
    {
        $this->services[$class] = $generator;
    }

    /**
     * 解析
     * @param $class string
     */
    public function make($class)
    {
        return call_user_func($this->services[$class]);
    }
}

# 2, 服务类示例
/**
 * Class Kernel
 * 内核服务类
 */
class Kernel
{
}
/**
 * Class Request
 * 请求服务类
 */
class Request
{
}

# 3, 绑定服务到容器,通常在程序初始化阶段完成
$app = new Application();
$app->bind('Kernel', function() {
    return new Kernel();
});
$app->bind('Request', function() {
    return new Request();
});

# 4, 需要时从容器中解析
$kernel = $app->make('Kernel');
var_dump($kernel);
$request = $app->make('Request');
var_dump($request);

$app 对象通过bind方法把 类Kernel 类Request 注册到容器中(其实就是一个数组);在需要类Kernel的对象$kernel时,通过make('Kernel')操作得到一个$kernel对象