php实现di
PHP 实现依赖注入(DI)的方法
依赖注入(Dependency Injection, DI)是一种设计模式,用于解耦代码并提高可测试性。PHP 中可以通过多种方式实现依赖注入,以下是常见的实现方法:
构造函数注入
通过构造函数传递依赖对象,是最常见的依赖注入方式。
class DatabaseConnection {
private $connection;
public function __construct($connection) {
$this->connection = $connection;
}
}
$connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$db = new DatabaseConnection($connection);
Setter 方法注入
通过 setter 方法动态设置依赖对象。
class Logger {
private $writer;
public function setWriter($writer) {
$this->writer = $writer;
}
}
$logger = new Logger();
$logger->setWriter(new FileWriter());
接口注入
定义接口来强制实现类接受依赖。

interface Injectable {
public function inject($dependency);
}
class Service implements Injectable {
private $dependency;
public function inject($dependency) {
$this->dependency = $dependency;
}
}
使用容器实现 DI
依赖注入容器可以自动管理依赖关系。
class Container {
private $services = [];
public function register($name, $callback) {
$this->services[$name] = $callback;
}
public function get($name) {
if (isset($this->services[$name])) {
return call_user_func($this->services[$name], $this);
}
throw new Exception("Service not found: {$name}");
}
}
$container = new Container();
$container->register('db', function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$db = $container->get('db');
使用第三方库
PHP 有许多成熟的 DI 容器库:

- PHP-DI: 功能强大的依赖注入容器
use DI\ContainerBuilder;
$builder = new ContainerBuilder(); $builder->addDefinitions([ 'db' => function() { return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); } ]); $container = $builder->build(); $db = $container->get('db');
2. Symfony DependencyInjection: Symfony 框架的 DI 组件
```php
use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
$container->register('db', 'PDO')
->addArgument('mysql:host=localhost;dbname=test')
->addArgument('user')
->addArgument('pass');
$db = $container->get('db');
自动装配
现代 PHP 框架通常支持自动依赖注入。
class UserController {
private $userRepository;
public function __construct(UserRepository $userRepository) {
$this->userRepository = $userRepository;
}
}
在 Laravel 等框架中,控制器会自动解析并注入 UserRepository 实例。
最佳实践
- 优先使用构造函数注入,使依赖关系明确
- 对可选依赖使用 setter 注入
- 考虑使用容器管理复杂的依赖关系
- 遵循依赖倒置原则,依赖于抽象而非具体实现
通过合理使用依赖注入,可以提高代码的可测试性、可维护性和灵活性。






