依赖注入php实现
依赖注入的实现方式
在PHP中,依赖注入(Dependency Injection,DI)是一种设计模式,用于解耦组件之间的依赖关系。通过依赖注入,对象的依赖关系由外部容器或调用者提供,而不是在对象内部创建。
构造函数注入
构造函数注入是最常见的依赖注入方式。依赖通过类的构造函数传递。

class DatabaseConnection {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function connect() {
// 使用$config建立数据库连接
}
}
$config = ['host' => 'localhost', 'username' => 'root'];
$db = new DatabaseConnection($config);
属性注入
属性注入通过类的公共属性或setter方法注入依赖。
class Logger {
private $writer;
public function setWriter($writer) {
$this->writer = $writer;
}
public function log($message) {
$this->writer->write($message);
}
}
$logger = new Logger();
$logger->setWriter(new FileWriter());
接口注入
接口注入要求类实现特定接口,依赖通过接口方法注入。

interface InjectorInterface {
public function inject($dependency);
}
class Service implements InjectorInterface {
private $dependency;
public function inject($dependency) {
$this->dependency = $dependency;
}
}
使用依赖注入容器
依赖注入容器(DIC)可以自动管理依赖关系。PHP中有多个成熟的DI容器库,如PHP-DI、Symfony DependencyInjection等。
// 使用PHP-DI示例
require 'vendor/autoload.php';
use DI\ContainerBuilder;
$builder = new ContainerBuilder();
$builder->addDefinitions([
'Database' => function() {
return new DatabaseConnection(['host' => 'localhost']);
}
]);
$container = $builder->build();
$db = $container->get('Database');
自动依赖注入
现代PHP框架如Laravel提供了自动依赖注入功能,无需手动配置。
// Laravel中的控制器方法自动注入
class UserController {
public function show(UserRepository $users) {
// $users会自动注入
}
}
最佳实践
- 尽量使用构造函数注入,因为它使依赖关系明确且不可变
- 避免在类内部直接实例化依赖对象
- 对于可选依赖,可以使用setter方法注入
- 考虑使用依赖注入容器管理复杂依赖关系
依赖注入提高了代码的可测试性和可维护性,是现代化PHP应用开发的重要技术。






