当前位置:首页 > PHP

php 实现依赖注入

2026-03-13 09:38:07PHP

依赖注入的概念

依赖注入(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容器库,例如:

  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

    php 实现依赖注入

    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记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…