当前位置:首页 > PHP

php 实现依赖注入

2026-03-13 09:38:07PHP

依赖注入的概念

依赖注入(Dependency Injection, DI)是一种设计模式,用于解耦组件之间的依赖关系。通过将依赖对象从外部注入,而不是在类内部直接创建,可以提高代码的可测试性和可维护性。

手动实现依赖注入

通过构造函数或方法参数显式传递依赖对象。

php 实现依赖注入

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 实现依赖注入

  1. 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);
  2. 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)和配置化实现松散耦合

标签: php
分享给朋友:

相关文章

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…