当前位置:首页 > 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 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现分类

php实现分类

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

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php搜索功能实现的

php搜索功能实现的

PHP 搜索功能实现方法 数据库搜索实现 使用 SQL 的 LIKE 语句进行模糊匹配,适用于小型网站和简单搜索需求。 $searchTerm = $_GET['search']; $query =…