php 容器实现
PHP 容器实现
PHP 容器通常指依赖注入容器(Dependency Injection Container),用于管理对象的创建和依赖关系。以下是几种常见的 PHP 容器实现方式:
使用 Pimple(轻量级容器)
Pimple 是一个简单的 PHP 依赖注入容器,适合小型项目或快速原型开发。
require_once 'vendor/autoload.php';
$container = new Pimple\Container();
// 注册服务
$container['db'] = function ($c) {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
};
// 获取服务
$db = $container['db'];
使用 Symfony DependencyInjection 组件
Symfony 的 DependencyInjection 组件提供了更强大的功能,适合中大型项目。
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$container = new ContainerBuilder();
// 注册服务
$container->register('mailer', 'Mailer')
->addArgument('sendmail');
$container->register('newsletter_manager', 'NewsletterManager')
->addArgument(new Reference('mailer'));
// 获取服务
$newsletterManager = $container->get('newsletter_manager');
使用 PHP-DI
PHP-DI 是一个功能丰富的依赖注入容器,支持自动装配和注解。
use DI\ContainerBuilder;
$containerBuilder = new ContainerBuilder();
$container = $containerBuilder->build();
// 注册服务
$container->set('db', function () {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
// 获取服务
$db = $container->get('db');
自定义容器实现
如果需要完全控制容器的行为,可以自定义一个简单的容器类。
class Container {
private $services = [];
public function set($id, callable $factory) {
$this->services[$id] = $factory;
}
public function get($id) {
if (!isset($this->services[$id])) {
throw new Exception("Service not found: $id");
}
return $this->services[$id]($this);
}
}
// 使用自定义容器
$container = new Container();
$container->set('db', function () {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$db = $container->get('db');
容器的高级功能
自动装配
某些容器(如 PHP-DI)支持自动装配,无需手动注册服务。
$containerBuilder = new ContainerBuilder();
$containerBuilder->useAutowiring(true);
$container = $containerBuilder->build();
// 自动解析依赖
$controller = $container->get(MyController::class);
注解支持
使用注解定义依赖关系(需配合 Doctrine Annotations 等库)。
use DI\Annotation\Inject;
class MyController {
/
* @Inject
* @var MyService
*/
private $service;
}
延迟加载
某些容器支持延迟加载服务,只有在实际使用时才创建对象。

$container->set('heavy_service', function () {
return new HeavyService();
}, true); // 设置为延迟加载
最佳实践
- 避免服务定位器模式:尽量通过构造函数注入依赖,而不是直接从容器中获取服务。
- 使用接口绑定:将服务绑定到接口,提高代码的可测试性和可维护性。
- 合理划分作用域:区分单例服务和每次请求新建的服务。
性能优化
- 缓存容器配置:在生产环境中缓存容器的配置,避免每次请求都重新解析。
- 使用编译容器:某些容器(如 Symfony)支持将容器编译为 PHP 代码,提高性能。
以上方法涵盖了从简单到复杂的 PHP 容器实现,可以根据项目需求选择合适的方案。






