最近研究了一下服务容器的概念。网上也找了很多资料,也动手敲了不少代码,总结一下自己的看法。
服务容器应该不能说是一种技术,而是一种设计思想,主要解决了我们在代码中类依赖的问题。看个例子:
class Drive
{
public $car;
public function __construct(Car $car)
{
$this->car = $car;
}
public function do()
{
echo "drive ";
$this->car->do();
}
}
class People
{
public $drive;
public function __construct(Drive $drive)
{
$this->drive = $drive;
}
public function do()
{
echo "people ";
$this->dirve->do();
}
}
class Car {
public function do() {
echo "car";
}
}
如代码所示,我们想要得到一个people类,必须依赖drive类,而drive类必须依赖car类,实际代码中可能比这个要复杂的多,如果有一种方法,我们直接传入people类名,就能返回people对象,多方便。这就是容器,容器可以帮助我们完成类依赖的自动处理和依赖注入等很多复杂的工作,对外则只需要很简单的调用。
这里有一个依赖注入的概念,对应的还有一个控制反转的概念,可以看看这篇博文介绍。
依赖注入和控制反转是对同一件事情的不同描述,它们描述的角度不同。依赖注入是从应用程序的角度在描述,应用程序依赖容
器创建并注入它所需要的外部资源。而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向的向应用程序注入应用
程序所需要的外部资源。
那怎么实现一个容器呢,容器的核心就是帮我们理清一个类的依赖关系,比如上面的people类依赖drive类,那么我们怎么知道这种关系呢。其实php提供类很强大的反射机制,里面包括了很多对象,关于怎么使用,可以看这篇文章
动手实现了一个简单的容器类,关于代码的解释可以看这篇文章
这里面有很多概念的东西,感觉写不出来,必须要多多敲它几百行代码方可破。