PHP 依赖注入容器:依赖注入完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 依赖注入容器:完全指南



依赖注入(DI)是面向对象编程中关键的设计模式之一,它允许创建低耦合、可测试且易于维护的应用程序。在 PHP 中,这种方法通过专门的工具——依赖注入容器(也称为依赖注入容器)来实现。在本文中,我们将详细讨论什么是 DI 容器、它是如何工作的,并介绍 PHP 的最佳库。



什么是依赖注入?



依赖注入是一种技术,对象从外部获取其依赖项,而不是自己创建它们。与其在类内部编写 new Database(),不如通过构造函数、设置器或接口传递一个准备好的对象。这使得代码更加灵活,并简化了测试。



没有 DI 的示例:

class UserService {    private $db;

public function __construct() { $this->db = new Database(); // 硬耦合 }}


通过构造函数使用 DI 的示例:

class UserService {    private $db;

public function __construct(Database $db) { $this->db = $db; // 依赖项从外部传递 }}


为什么需要 DI 容器?



当项目中类及其依赖项数量增多时,手动创建对象和传递依赖项会变得令人头疼。DI 容器自动化了这一过程。它充当中央注册表,知道如何创建对象并解析它们的依赖项。



DI 容器的主要功能:

  • 自动依赖项解析 — 容器自动查找并注入所需的对象。
  • 对象生命周期管理 — 可以配置是每次创建新实例还是使用单个实例(单例)。
  • 通过代码或文件进行配置 — 依赖项可以在 PHP、YAML、XML 或注解中描述。
  • 支持接口和抽象 — 容器可以将接口绑定到具体实现。


流行的 PHP DI 容器



在 PHP 生态系统中,有几种成熟的解决方案。让我们看看最流行的:



1. PHP-DI (PHP Dependency Injection)

最强大且方便的容器之一。支持自动装配(autowiring)、注解、通过 PHP 数组和 YAML 进行配置。非常适合现代应用程序。



使用 PHP-DI 的示例:

use DI\\ContainerBuilder;

$builder = new ContainerBuilder();$builder->addDefinitions([ 'db.host' => 'localhost', Database::class => DI\\create() ->constructor(DI\\get('db.host')),]);

$container = $builder->build();$db = $container->get(Database::class);


2. Symfony DependencyInjection

来自 Symfony 框架的组件,可以单独使用。通过 YAML、XML 或 PHP 提供灵活的配置。非常适合大型企业项目。



YAML 配置示例:

services:    App\\Service\\UserService:        arguments:            - '@App\\Repository\\UserRepository'            - '@logger'


3. Laravel Service Container

Laravel 框架的内置容器。支持自动装配、接口到实现的绑定、上下文绑定以及许多其他功能。在 Laravel 中默认使用。



接口绑定示例:

use App\\Contracts\\PaymentGateway;use App\\Services\\StripePayment;

$this->app->bind(PaymentGateway::class, StripePayment::class);


4. Pimple

由 Symfony 创建者开发的轻量级 DI 容器。适用于非

推荐