什么是依赖注入容器?
想象一下,你有一个玩具工厂,你需要生产各种玩具。每个玩具可能需要不同的零件,比如轮子、电池、小灯泡等。依赖注入容器就像一个智能的仓库管理员,它知道每种玩具需要哪些零件,并且能在你需要的时候把这些零件准备好。
在编程中,类就像玩具,而类需要的其他类或对象就像零件。依赖注入容器帮助我们管理这些“零件”,并在需要时把它们传递给相应的类。
使用场景
- 解耦:减少类之间的直接依赖关系,使得类的实现更加独立。
- 测试:更容易进行单元测试,因为可以轻松地替换依赖项。
- 灵活性:可以在运行时动态地改变依赖项,而不需要修改代码。
底层原理
- 注册:告诉容器需要哪些类及其依赖关系。
- 解析:容器根据注册信息创建并管理这些类的实例。
- 注入:将解析后的实例注入到需要的地方。
完整的 PHP 实例代码
假设我们有一个简单的应用,需要一个 Logger
来记录日志,一个 Database
来操作数据库,以及一个 UserService
来处理用户相关的逻辑。我们将使用依赖注入容器来管理这些类及其依赖关系。
1. 创建依赖注入容器
首先,我们创建一个简单的依赖注入容器类:
class Container
{
private $bindings = [];
// 注册一个类及其依赖关系
public function bind($abstract, $concrete)
{
$this->bindings[$abstract] = $concrete;
}
// 获取一个类的实例
public function get($abstract)
{
if (isset($this->bindings[$abstract])) {
$concrete = $this->bindings[$abstract];
return is_callable($concrete) ? $concrete($this) :