php 容器实现
PHP 容器实现的核心概念
PHP 容器(Dependency Injection Container)是一种管理对象依赖关系的工具,通过自动解析和注入依赖来简化代码。以下是实现容器的关键方法:
基础容器实现
创建一个简单的容器类,包含绑定和解析功能:
class Container {
protected $bindings = [];
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function make($abstract) {
if (!isset($this->bindings[$abstract])) {
throw new Exception("No binding found for {$abstract}");
}
$concrete = $this->bindings[$abstract];
if ($concrete instanceof Closure) {
return $concrete($this);
}
return new $concrete;
}
}
自动依赖解析
通过反射自动解析类的依赖:
public function resolve($class) {
$reflector = new ReflectionClass($class);
if (!$reflector->isInstantiable()) {
throw new Exception("Class {$class} is not instantiable");
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return new $class;
}
$parameters = $constructor->getParameters();
$dependencies = $this->resolveDependencies($parameters);
return $reflector->newInstanceArgs($dependencies);
}
protected function resolveDependencies($parameters) {
$dependencies = [];
foreach ($parameters as $parameter) {
$dependency = $parameter->getClass();
if (is_null($dependency)) {
if ($parameter->isDefaultValueAvailable()) {
$dependencies[] = $parameter->getDefaultValue();
} else {
throw new Exception("Cannot resolve dependency {$parameter->name}");
}
} else {
$dependencies[] = $this->resolve($dependency->name);
}
}
return $dependencies;
}
接口绑定实现
支持接口到具体类的绑定:
public function bindInterface($interface, $implementation) {
$this->bind($interface, function($container) use ($implementation) {
return $container->resolve($implementation);
});
}
单例模式支持
确保某些类只实例化一次:
protected $instances = [];
public function singleton($abstract, $concrete) {
$this->bind($abstract, function($container) use ($concrete) {
if (!isset($this->instances[$abstract])) {
$this->instances[$abstract] = $container->make($concrete);
}
return $this->instances[$abstract];
});
}
实际使用示例
$container = new Container();
$container->bind('logger', FileLogger::class);
$container->singleton('db', Database::class);
$logger = $container->make('logger');
$db = $container->make('db');
高级容器特性
对于更复杂的场景,可以考虑实现:
- 上下文绑定(根据调用环境提供不同实现)
- 装饰器模式支持
- 自动装配配置
- 延迟加载
- 标签系统
成熟的PHP容器实现可以参考:
- Laravel的服务容器
- PHP-DI
- Pimple
- Symfony的DependencyInjection组件
这些实现提供了更完善的功能和更好的性能,适合生产环境使用。







