php实现容器
PHP 实现容器的方法
在 PHP 中,容器通常用于依赖注入(DI)和管理对象生命周期。以下是几种常见的实现方式:
使用 PSR-11 兼容容器
PHP-FIG 的 PSR-11 标准定义了容器接口,可以通过实现 Psr\Container\ContainerInterface 来创建标准容器:
use Psr\Container\ContainerInterface;
class Container implements ContainerInterface {
private $services = [];
public function get($id) {
if (!$this->has($id)) {
throw new NotFoundException("Service not found: {$id}");
}
return $this->services[$id];
}
public function has($id) {
return isset($this->services[$id]);
}
public function set($id, $service) {
$this->services[$id] = $service;
}
}
依赖注入容器实现
更高级的容器可以支持自动依赖解析:
class DIContainer {
private $definitions = [];
private $instances = [];
public function set($id, $definition) {
$this->definitions[$id] = $definition;
}
public function get($id) {
if (isset($this->instances[$id])) {
return $this->instances[$id];
}
if (!isset($this->definitions[$id])) {
throw new Exception("Service not defined: {$id}");
}
$definition = $this->definitions[$id];
$instance = $this->resolve($definition);
$this->instances[$id] = $instance;
return $instance;
}
protected function resolve($definition) {
if (is_callable($definition)) {
return $definition($this);
}
if (is_string($definition) && class_exists($definition)) {
$reflection = new ReflectionClass($definition);
$constructor = $reflection->getConstructor();
if (!$constructor) {
return new $definition();
}
$parameters = $constructor->getParameters();
$dependencies = [];
foreach ($parameters as $parameter) {
$type = $parameter->getType();
if ($type && !$type->isBuiltin()) {
$dependencies[] = $this->get($type->getName());
} else {
throw new Exception("Cannot resolve parameter: {$parameter->getName()}");
}
}
return $reflection->newInstanceArgs($dependencies);
}
return $definition;
}
}
使用现有容器库
PHP 生态系统中有多个成熟的容器实现:

-
PHP-DI: 功能丰富的依赖注入容器
$container = new DI\Container(); -
Symfony DependencyInjection: Symfony 框架的组件

$container = new Symfony\Component\DependencyInjection\ContainerBuilder(); -
Laravel 容器: Laravel 框架的核心组件
$container = new Illuminate\Container\Container();
容器配置示例
典型的容器配置和使用方式:
$container = new DIContainer();
// 注册服务
$container->set('database', function($c) {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$container->set('user_repository', 'App\Repositories\UserRepository');
// 获取服务
$db = $container->get('database');
$userRepo = $container->get('user_repository');
容器的高级特性
成熟的容器通常支持以下特性:
- 自动装配(Autowiring)
- 服务标签(Service Tags)
- 工厂方法(Factories)
- 延迟加载(Lazy Loading)
- 作用域管理(Scopes)
- 参数注入(Parameter Injection)
选择容器实现时,应根据项目需求和复杂度决定是自行实现还是使用现有解决方案。对于大多数应用场景,成熟的容器库如 PHP-DI 或 Symfony DI 已经足够完善。






