php实现依赖注入
依赖注入的概念
依赖注入(Dependency Injection,DI)是一种设计模式,用于解耦组件之间的依赖关系。通过将依赖对象从外部注入,而非在类内部直接创建,提高代码的可测试性和可维护性。
实现依赖注入的步骤
定义依赖接口或类 创建一个接口或抽象类,定义依赖的行为。例如:
interface LoggerInterface {
public function log(string $message);
}
实现具体依赖 实现接口的具体类:

class FileLogger implements LoggerInterface {
public function log(string $message) {
file_put_contents('app.log', $message, FILE_APPEND);
}
}
通过构造函数注入 在需要使用依赖的类中,通过构造函数接收依赖:
class UserService {
private $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
public function register(string $username) {
$this->logger->log("User {$username} registered");
}
}
使用依赖注入容器 手动管理依赖可能繁琐,可以使用容器自动解析:

class Container {
private $bindings = [];
public function bind(string $abstract, callable $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function resolve(string $abstract) {
if (isset($this->bindings[$abstract])) {
return call_user_func($this->bindings[$abstract]);
}
throw new Exception("No binding found for {$abstract}");
}
}
// 使用容器
$container = new Container();
$container->bind(LoggerInterface::class, function() {
return new FileLogger();
});
$logger = $container->resolve(LoggerInterface::class);
$userService = new UserService($logger);
使用第三方库
流行的PHP依赖注入库如:
- PHP-DI:支持自动装配和注解
- Symfony DependencyInjection:功能强大,适合大型项目
- Laravel容器:内置在Laravel框架中
以PHP-DI为例:
require_once 'vendor/autoload.php';
use DI\ContainerBuilder;
$builder = new ContainerBuilder();
$builder->addDefinitions([
LoggerInterface::class => \DI\create(FileLogger::class)
]);
$container = $builder->build();
$userService = $container->get(UserService::class);
依赖注入的优势
- 解耦:减少类之间的直接依赖
- 可测试性:便于单元测试,可轻松替换为Mock对象
- 可维护性:修改依赖实现时无需改动使用方代码
注意事项
- 避免过度注入,导致构造函数参数过多
- 对于简单项目,手动注入可能比容器更直观
- 确保容器配置正确,避免循环依赖问题






