PHP-DI 用于 PHP:完整指南与示例

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

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

开始课程

PHP-DI 简介:它是什么以及为什么需要它

\n\n

PHP-DI(PHP 依赖注入)是一个用于在 PHP 应用程序中实现依赖注入(Dependency Injection, DI)的强大库。它实现了控制反转(Inversion of Control, IoC)模式,并提供了一个容器来自动解析类之间的依赖关系。

\n\n

为什么需要 PHP-DI?在现代 PHP 项目(尤其是在 Laravel、Symfony、Slim 等框架中)中,类通常依赖于其他类。如果没有 DI 容器,您必须手动创建所有依赖项——这会导致:

\n
    \n
  • 代码的紧耦合(tight coupling)
  • \n
  • 测试困难
  • \n
  • 创建对象时代码重复
  • \n
  • 维护和扩展困难
  • \n
\n\n

PHP-DI 通过自动确定您的代码需要哪些类,并创建带有正确依赖项的类来解决这些问题。该库支持:

\n
    \n
  • 通过构造函数自动注入
  • \n
  • 通过注解(phpDoc)定义依赖项
  • \n
  • 通过数组、YAML 或 PHP 文件进行配置
  • \n
  • 延迟加载(lazy loading)
  • \n
  • 与流行框架集成
  • \n
\n\n

安装 PHP-DI

\n\n

PHP-DI 通过 Composer(PHP 的标准包管理器)安装:

\n\n
composer require php-di/php-di
\n\n

如果您使用 Slim 框架,请安装集成包:

\n\n
composer require php-di/slim-bridge
\n\n

对于 Symfony,有一个单独的包:

\n\n
composer require php-di/symfony-bridge
\n\n

安装后,在您的项目中引入 Composer 的自动加载器:

\n\n
require __DIR__ . '/vendor/autoload.php';
\n\n

快速入门与代码示例

\n\n

让我们看一个使用 PHP-DI 的最简单示例。假设我们有一个 Mailer 类,它依赖于 Logger 类:

\n\n
<?php\n// Logger 类\nclass Logger {\n    public function log($message) {\n        echo "[LOG]: " . $message . "\\n";\n    }\n}\n\n// Mailer 类,依赖于 Logger\nclass Mailer {\n    private $logger;\n    \n    public function __construct(Logger $logger) {\n        $this->logger = $logger;\n    }\n    \n    public function send($to, $subject) {\n        $this->logger->log("正在发送邮件至 {$to}: {$subject}");\n        // 发送逻辑...\n    }\n}\n\n// 创建 DI 容器\n$container = new DI\\Container();\n\n// 获取 Mailer 对象——所有依赖项自动解析\n$mailer = $container->get('Mailer');\n$mailer->send('user@example.com', '你好!');\n?>
\n\n

在这个例子中,PHP-DI 自动创建了一个 Logger 实例并将其传递给 Mailer 的构造函数。您无需编写 new Logger()——容器会为您完成。

\n\n

PHP-DI 的主要方法和函数

\n\n

1. Container::get() — 从容器中获取对象

\n

功能: 根据名称(类、接口或别名)从容器中提取对象。如果对象尚未创建,容器会创建它及其所有依赖项。

\n

参数:

\n
    \n
  • string $name — 类名、接口名或别名
  • \n
\n

示例:

\n
$container = new DI\\Container();\n$logger = $container->get('Logger'); // 创建并返回 Logger 对象\n$mailer = $container->get('Mailer'); // 创建包含 Logger 的 Mailer
\n\n

2. Container::set() — 注册定义

\n

功能: 为类、接口或别名注册定义。允许指定对象应如何创建。

\n

参数:

\n
    \n
  • string $name — 类名或别名
  • \n
  • mixed $definition — 描述

推荐