PHP-DI 简介:它是什么以及为什么需要它
\n\nPHP-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
PHP-DI 通过自动确定您的代码需要哪些类,并创建带有正确依赖项的类来解决这些问题。该库支持:
\n- \n
- 通过构造函数自动注入 \n
- 通过注解(phpDoc)定义依赖项 \n
- 通过数组、YAML 或 PHP 文件进行配置 \n
- 延迟加载(lazy loading) \n
- 与流行框架集成 \n
安装 PHP-DI
\n\nPHP-DI 通过 Composer(PHP 的标准包管理器)安装:
\n\ncomposer require php-di/php-di\n\n如果您使用 Slim 框架,请安装集成包:
\n\ncomposer require php-di/slim-bridge\n\n对于 Symfony,有一个单独的包:
\n\ncomposer require php-di/symfony-bridge\n\n安装后,在您的项目中引入 Composer 的自动加载器:
\n\nrequire __DIR__ . '/vendor/autoload.php';\n\n快速入门与代码示例
\n\n让我们看一个使用 PHP-DI 的最简单示例。假设我们有一个 Mailer 类,它依赖于 Logger 类:
<?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()——容器会为您完成。
PHP-DI 的主要方法和函数
\n\n1. Container::get() — 从容器中获取对象
\n功能: 根据名称(类、接口或别名)从容器中提取对象。如果对象尚未创建,容器会创建它及其所有依赖项。
\n参数:
\n- \n
string $name— 类名、接口名或别名 \n
示例:
\n$container = new DI\\Container();\n$logger = $container->get('Logger'); // 创建并返回 Logger 对象\n$mailer = $container->get('Mailer'); // 创建包含 Logger 的 Mailer\n\n2. Container::set() — 注册定义
\n功能: 为类、接口或别名注册定义。允许指定对象应如何创建。
\n参数:
\n- \n
string $name— 类名或别名 \n mixed $definition— 描述