当前位置:首页 > PHP

php 依赖注入 实现

2026-02-16 14:24:38PHP

依赖注入的基本概念

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

手动依赖注入实现

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

php 依赖注入 实现

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

安装 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 对象进行单元测试。
  • 灵活性:依赖实现可动态替换。

注意事项

  • 避免过度依赖容器,手动注入在小项目中更简单。
  • 循环依赖需通过接口或延迟加载解决。

标签: php
分享给朋友:

相关文章

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现排序

php实现排序

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

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…