当前位置:首页 > PHP

php实现di

2026-02-14 13:58:26PHP

PHP 实现依赖注入(DI)的方法

依赖注入(Dependency Injection,DI)是一种设计模式,用于解耦代码并提高可测试性。以下是几种在 PHP 中实现 DI 的方式:

手动依赖注入

通过构造函数或方法参数显式传递依赖对象。这种方式简单直接,适合小型项目。

class Database {
    public function query($sql) {
        // 执行数据库查询
    }
}

class UserService {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function getUsers() {
        return $this->db->query('SELECT * FROM users');
    }
}

// 使用
$db = new Database();
$userService = new UserService($db);

使用容器实现 DI

依赖注入容器(DIC)可以自动管理依赖关系。以下是简单容器的实现示例:

php实现di

class Container {
    private $instances = [];

    public function set($name, callable $resolver) {
        $this->instances[$name] = $resolver;
    }

    public function get($name) {
        if (isset($this->instances[$name])) {
            return $this->instances[$name]();
        }
        throw new Exception("未找到依赖: {$name}");
    }
}

// 配置容器
$container = new Container();
$container->set('db', function() {
    return new Database();
});

$container->set('userService', function() use ($container) {
    return new UserService($container->get('db'));
});

// 使用
$userService = $container->get('userService');

使用第三方库

许多 PHP 框架和库提供了成熟的 DI 容器实现:

  1. PHP-DI:功能丰富的依赖注入容器

    php实现di

    use DI\ContainerBuilder;
    
    $builder = new ContainerBuilder();
    $builder->addDefinitions([
        'db' => function() {
            return new Database();
        },
        'userService' => \DI\create(UserService::class)
            ->constructor(\DI\get('db'))
    ]);
    $container = $builder->build();
    
    $userService = $container->get('userService');
  2. Laravel 服务容器:Laravel 框架内置的 DI 容器

    app()->bind('db', function() {
        return new Database();
    });
    
    app()->bind('userService', function($app) {
        return new UserService($app->make('db'));
    });
    
    $userService = app()->make('userService');

自动装配(Autowiring)

现代 DI 容器通常支持自动解析依赖关系:

// PHP-DI 示例
$builder = new ContainerBuilder();
$builder->useAutowiring(true);
$container = $builder->build();

// 自动解析 UserService 的依赖
$userService = $container->get(UserService::class);

接口绑定

将接口绑定到具体实现,提高灵活性:

interface DatabaseInterface {
    public function query($sql);
}

class MySQLDatabase implements DatabaseInterface {
    public function query($sql) {
        // MySQL 实现
    }
}

// 容器配置
$container->set(DatabaseInterface::class, function() {
    return new MySQLDatabase();
});

// 使用接口类型提示
class UserService {
    public function __construct(DatabaseInterface $db) {
        // ...
    }
}

最佳实践

  1. 优先使用构造函数注入,保持依赖关系明确
  2. 对于复杂项目,考虑使用成熟的 DI 容器库
  3. 结合接口编程,提高代码的可替换性和可测试性
  4. 避免服务定位器模式(Service Locator),它实际上是反模式

通过合理使用依赖注入,可以显著提高代码的可维护性和可测试性,特别是在大型应用程序中。

标签: phpdi
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现队列

php实现队列

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

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php实现登陆

php实现登陆

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

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…