当前位置:首页 > PHP

php怎么实现依赖注入

2026-04-03 09:47:26PHP

依赖注入的实现方法

在PHP中实现依赖注入(Dependency Injection, DI)通常有以下几种方式:

构造函数注入

通过类的构造函数传递依赖对象。这是最常见的方式,适合强制依赖项。

class DatabaseService {
    private $connection;

    public function __construct(PDO $connection) {
        $this->connection = $connection;
    }
}

$connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$databaseService = new DatabaseService($connection);

setter方法注入

通过setter方法设置依赖对象。适合可选依赖项或需要动态更换依赖的情况。

php怎么实现依赖注入

class Logger {
    private $writer;

    public function setWriter(WriterInterface $writer) {
        $this->writer = $writer;
    }
}

$logger = new Logger();
$logger->setWriter(new FileWriter());

接口注入

依赖项通过接口定义,实现类必须提供注入方法。

interface InjectLogger {
    public function inject(Logger $logger);
}

class UserService implements InjectLogger {
    private $logger;

    public function inject(Logger $logger) {
        $this->logger = $logger;
    }
}

使用容器实现DI

依赖注入容器可以自动管理对象的创建和依赖关系:

php怎么实现依赖注入

简单容器实现

class Container {
    private $services = [];

    public function register(string $name, callable $resolver) {
        $this->services[$name] = $resolver;
    }

    public function get(string $name) {
        if (!isset($this->services[$name])) {
            throw new Exception("Service not found: {$name}");
        }
        return $this->services[$name]($this);
    }
}

$container = new Container();
$container->register('db', function() {
    return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$container->register('userService', function($container) {
    return new UserService($container->get('db'));
});

使用现有DI框架

主流PHP框架都提供DI容器:

Laravel容器示例

// 绑定
app()->bind('mailer', function($app) {
    return new Mailer($app->make('config'));
});

// 解析
$mailer = app()->make('mailer');

Symfony容器示例

# services.yaml
services:
    App\Mail\Mailer:
        arguments: ['@mail.transport']

自动装配实现

现代框架支持基于类型提示的自动依赖解析:

class OrderService {
    public function __construct(
        private PaymentGateway $gateway,
        private LoggerInterface $logger
    ) {}
}

// 容器会自动解析并注入PaymentGateway和LoggerInterface的实现
$orderService = $container->get(OrderService::class);

最佳实践

  • 优先使用构造函数注入强制依赖
  • 对可选依赖使用setter注入
  • 遵循依赖倒置原则,依赖抽象而非具体实现
  • 对复杂项目使用成熟的DI容器
  • 避免服务定位器模式(Service Locator),它实际上是DI的反模式

通过合理使用依赖注入,可以提高代码的可测试性、可维护性和灵活性。

标签: php
分享给朋友:

相关文章

php实现队列

php实现队列

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

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现https

php 实现https

在 PHP 中实现 HTTPS 确保 PHP 应用通过 HTTPS 协议安全传输数据,可以通过以下几种方式实现: 配置服务器强制 HTTPS 在 Web 服务器(如 Apache 或 Nginx)中…

php实现多进程

php实现多进程

PHP 实现多进程的方法 PHP 本身是单线程的脚本语言,但可以通过扩展或系统调用来实现多进程操作。以下是几种常见的实现方式: 使用 pcntl 扩展 pcntl(Process Control)是…

php评论功能实现

php评论功能实现

数据库设计 创建一个评论表存储评论数据,表结构可包含以下字段: id:自增主键 content:评论内容(TEXT类型) user_id:关联用户表的ID article_id:关联文章表的ID c…