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

class DatabaseConnection {
public function connect() {
return "Database connected";
}
}
class UserService {
private $db;
public function __construct(DatabaseConnection $db) {
$this->db = $db;
}
public function getUser() {
return $this->db->connect() . " - User data";
}
}
$db = new DatabaseConnection();
$userService = new UserService($db);
echo $userService->getUser();
使用容器实现依赖注入
依赖注入容器(DIC)可以自动管理依赖关系的创建和注入。
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];
if (is_callable($concrete)) {
return $concrete($this);
}
return $this->resolve($concrete);
}
return new $abstract();
}
}
$container = new Container();
$container->bind(DatabaseConnection::class, function() {
return new DatabaseConnection();
});
$userService = $container->resolve(UserService::class);
echo $userService->getUser();
使用第三方库
PHP生态中有多个成熟的DI容器库,例如:

-
PHP-DI
require_once 'vendor/autoload.php'; use DI\ContainerBuilder; $builder = new ContainerBuilder(); $builder->addDefinitions([ DatabaseConnection::class => DI\create(DatabaseConnection::class) ]); $container = $builder->build(); $userService = $container->get(UserService::class); -
Symfony DependencyInjection
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; $container = new ContainerBuilder(); $container->register('db', DatabaseConnection::class); $container->register('user.service', UserService::class) ->addArgument(new Reference('db')); $userService = $container->get('user.service');
最佳实践
- 尽量使用接口而非具体类绑定依赖
- 避免在构造函数中直接实例化依赖对象
- 对于复杂依赖关系,优先使用容器管理
- 结合自动加载(PSR-4)和配置化实现松散耦合






