php 容器实现
PHP 容器实现方法
依赖注入容器(DIC)
PHP 容器通常指依赖注入容器,用于管理对象依赖关系。以下是一个简单实现:
class Container {
private $bindings = [];
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function make($abstract) {
if (isset($this->bindings[$abstract])) {
$concrete = $this->bindings[$abstract];
if (is_callable($concrete)) {
return $concrete($this);
}
return new $concrete();
}
throw new Exception("No binding found for {$abstract}");
}
}
使用示例

$container = new Container();
$container->bind('database', function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$db = $container->make('database');
自动依赖解析实现
容器可以自动解析构造函数依赖:
public function make($abstract) {
$reflector = new ReflectionClass($abstract);
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return new $abstract;
}
$parameters = $constructor->getParameters();
$dependencies = array_map(function($param) {
return $this->make($param->getClass()->name);
}, $parameters);
return $reflector->newInstanceArgs($dependencies);
}
单例模式支持
扩展容器以支持单例模式:

private $instances = [];
public function singleton($abstract, $concrete) {
$this->bind($abstract, function($container) use ($concrete) {
if (!isset($this->instances[$abstract])) {
$this->instances[$abstract] = is_callable($concrete)
? $concrete($container)
: new $concrete();
}
return $this->instances[$abstract];
});
}
接口绑定实现
支持接口到具体类的绑定:
$container->bind(DatabaseInterface::class, MySQLDatabase::class);
$db = $container->make(DatabaseInterface::class); // 返回 MySQLDatabase 实例
现有容器库推荐
- PHP-DI:功能全面的依赖注入容器,支持注解配置
- Laravel 容器:Laravel 框架内置的强大容器
- Pimple:轻量级容器实现,适合小型项目
性能优化建议
对于生产环境,考虑:
- 使用缓存解析结果
- 预编译容器配置
- 避免深度依赖嵌套
以上实现展示了PHP容器的核心概念,实际应用中可根据需求扩展更多功能如作用域管理、上下文绑定等。






