php实现容器
PHP 实现容器的方法
PHP 中的容器(Container)通常指依赖注入容器(Dependency Injection Container),用于管理对象的创建和依赖关系。以下是几种实现方式:
使用 Pimple(轻量级容器)
Pimple 是一个简单的 PHP 依赖注入容器,适合小型项目。
require_once 'vendor/autoload.php';
$container = new Pimple\Container();
// 注册服务
$container['service'] = function ($c) {
return new SomeService();
};
// 获取服务
$service = $container['service'];
使用 Symfony DependencyInjection 组件
Symfony 的 DependencyInjection 组件提供了更强大的容器功能。
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$container = new ContainerBuilder();
// 注册服务
$container->register('service', 'SomeService');
$container->register('dependent_service', 'DependentService')
->addArgument(new Reference('service'));
// 获取服务
$service = $container->get('dependent_service');
手动实现简单容器
可以手动实现一个基础的容器类。

class Container {
protected $instances = [];
public function set($key, $concrete) {
$this->instances[$key] = $concrete;
}
public function get($key) {
if (isset($this->instances[$key])) {
return $this->instances[$key]();
}
throw new Exception("Service not found: {$key}");
}
}
// 使用示例
$container = new Container();
$container->set('db', function () {
return new DatabaseConnection();
});
$db = $container->get('db');
使用 PHP-DI
PHP-DI 是一个功能丰富的依赖注入容器,支持自动装配和注解。
use DI\Container;
use DI\ContainerBuilder;
$builder = new ContainerBuilder();
$builder->addDefinitions([
'service' => \DI\create('SomeService')
]);
$container = $builder->build();
// 获取服务
$service = $container->get('service');
容器的高级特性
-
自动装配(Autowiring)
容器可以自动解析类的依赖关系,无需手动配置。
-
懒加载(Lazy Loading)
服务只在首次使用时初始化,节省资源。 -
参数注入
支持通过配置文件或代码注入参数。 -
作用域管理
支持单例(Singleton)或每次请求新实例(Prototype)模式。
最佳实践
- 优先使用成熟的容器库(如 Symfony 或 PHP-DI)。
- 避免将容器作为全局变量传递,应通过构造函数注入。
- 为容器编写单元测试,确保依赖解析正确。
通过以上方法,可以灵活地在 PHP 中实现和管理容器。






