php 依赖注入 实现
依赖注入的基本概念
依赖注入(Dependency Injection, DI)是一种设计模式,用于解耦组件之间的依赖关系。通过将依赖对象从外部注入,而非在类内部直接创建,提高代码的可测试性和可维护性。
手动依赖注入实现
通过构造函数或方法参数显式传递依赖对象。

class DatabaseConnection {
public function connect() {
return "Connected to database";
}
}
class UserService {
private $db;
// 构造函数注入
public function __construct(DatabaseConnection $db) {
$this->db = $db;
}
public function getUser() {
return $this->db->connect() . " to fetch user";
}
}
// 使用
$db = new DatabaseConnection();
$userService = new UserService($db);
echo $userService->getUser();
使用容器管理依赖
通过依赖注入容器(DI Container)自动解析和注入依赖关系。
class Container {
private $bindings = [];
// 绑定接口或类到实现
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
// 解析依赖
public function resolve($abstract) {
if (isset($this->bindings[$abstract])) {
$concrete = $this->bindings[$abstract];
return new $concrete();
}
return new $abstract();
}
}
// 示例使用
$container = new Container();
$container->bind(DatabaseConnection::class, DatabaseConnection::class);
$userService = $container->resolve(UserService::class);
echo $userService->getUser();
使用第三方库(如 PHP-DI)
PHP-DI 是一个流行的依赖注入容器库,支持自动装配和注解。

安装 PHP-DI:
composer require php-di/php-di
示例代码:
use DI\Container;
use DI\ContainerBuilder;
class Logger {
public function log($message) {
echo "Log: $message";
}
}
class OrderService {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function createOrder() {
$this->logger->log("Order created");
}
}
// 配置容器
$containerBuilder = new ContainerBuilder();
$container = $containerBuilder->build();
// 自动解析依赖
$orderService = $container->get(OrderService::class);
$orderService->createOrder();
依赖注入的优势
- 解耦性:减少类之间的直接依赖。
- 可测试性:便于通过 Mock 对象进行单元测试。
- 灵活性:依赖实现可动态替换。
注意事项
- 避免过度依赖容器,手动注入在小项目中更简单。
- 循环依赖需通过接口或延迟加载解决。






