php实现容器
PHP 实现容器的方法
依赖注入容器基础
PHP 中实现容器通常基于依赖注入(DI)原则,容器用于管理对象的创建和依赖关系。以下是实现容器的核心方法:
-
注册服务
容器需要提供注册服务的方法,通常通过键值对存储服务定义。服务可以是类名、闭包或实例。 -
解析服务
容器根据注册的服务定义解析依赖关系,自动实例化对象并注入依赖。 -
自动装配
支持通过反射自动解析类的构造函数参数,无需手动注册所有依赖。
简单容器实现示例
以下是一个基础的 PHP 容器实现代码:
class Container {
protected $bindings = [];
public function bind($abstract, $concrete = null) {
if (is_null($concrete)) {
$concrete = $abstract;
}
$this->bindings[$abstract] = $concrete;
}
public function make($abstract, $parameters = []) {
if (!isset($this->bindings[$abstract])) {
$this->bind($abstract);
}
$concrete = $this->bindings[$abstract];
if ($concrete instanceof Closure) {
return $concrete($this, $parameters);
}
$reflector = new ReflectionClass($concrete);
if (!$reflector->isInstantiable()) {
throw new Exception("Class {$concrete} is not instantiable");
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return new $concrete;
}
$dependencies = $constructor->getParameters();
$instances = $this->resolveDependencies($dependencies);
return $reflector->newInstanceArgs($instances);
}
protected function resolveDependencies($dependencies) {
$results = [];
foreach ($dependencies as $dependency) {
$results[] = $this->make($dependency->getClass()->name);
}
return $results;
}
}
使用示例
$container = new Container();
$container->bind('Database', function() {
return new Database('localhost', 'user', 'password');
});
$db = $container->make('Database');
高级功能扩展
-
单例绑定
修改容器以支持单例模式,确保每次解析返回同一实例。 -
接口绑定
允许将接口绑定到具体实现,提高代码的灵活性。 -
参数传递
支持在解析时传递构造参数,覆盖自动解析的值。 -
别名系统
为服务提供别名支持,简化服务调用。
现有容器库推荐
-
PHP-DI
功能完善的依赖注入容器,支持注解配置和自动装配。 -
Laravel 容器
Laravel 框架的容器实现,提供丰富的功能如上下文绑定和标签。 -
Pimple
轻量级容器,适合小型项目使用。
实现容器时需注意循环依赖问题,可通过延迟解析或代理模式解决。







