通俗的讲,服务容器就是许多服务存放的地方。
通常一个容器具有绑定和解析两个操作:
- 绑定,指的是将获取服务对象的方法在容器中进行注册。相当于把服务装入到容器中。
- 解析,指的是将绑定到容器中的服务从容器中提取出来,注意通常我们绑定的不是对象本身,而是生成对象的代码,一次解析时通常是执行代码来得到对象。
# 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
对象