PHP 服务容器
1. 实现一个服务容器类
- 服务容器(Container)的通俗概念就是一个容器,一个管理对象的容器。把类实例放进去是一个方法,取出来也是一个方法。
- 创建一个服务容器
class Container1
{
// 对象容器
protected $instances = []; //创建一个容器池(数组)
//实现类实例的实例化,并保存到一个数组中
// 绑定: 向对象容器中添加一个类实例
public function bind($alias, \Closure $process)
{
$this->instances[$alias] = $process;
}
// 取出: 从容器中取出一个类实例 (new)
public function make($alias, $params = [])
{
return call_user_func_array($this->instances[$alias], []);
}
}
- 把对象绑定到容器
$container = new Container1;
// 绑定
$container->bind('model', function () {
return new Model;
});
$container->bind('view', function () {
return new View;
});
- 创建好了一个服务容器,接下来就需要把容器注入到控制器的 index 方法中,以用容器管理对象。
class Controller4
{
public function index(Container1 $container)
{
// 1. 获取数据
$data = $container->make('model')->getData();
// 2. 渲染模板/视图
return $container->make('view')->fetch($data);
}
}
- 随后调用控制器,控制器又调用容器。
// 实例化控制器类
$controller = new Controller4();
echo $controller->index($container);
2. 对象销毁
- 每创建一个对象,就会占用相应的内存,所以当这个对象使用完成之后,及时的释放对象,可以避免内存占用,导致服务器性能下降。
- 析构函数销毁对象
function __destruct()
{
echo "再见" . $this->name;
}
3. 总结
这样就使用了服务容器将所有要用的对象进行封装,在服务容器内进行了统一的管理。在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就“失控”了,渐渐“丑陋接口,肮脏实现”,项目维护成本和难度上升,到了难以维持的程度,只有重构或者重新开发。