ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 开始 欢迎!这份指南将帮助你在项目中使用PHP-DI. 在开始之前,你需要知道什么是[依赖注入](understanding-di.md). 如果你不知道,这一整篇文章就是为了它: 了解依赖注入. ## 安装 Install PHP-DI with [Composer](http://getcomposer.org/doc/00-intro.md): ``` composer require php-di/php-di ``` PHP-DI 需要 PHP 5.5以上版本. ## 基础应用 ### 1. 使用依赖注入 第一,让我们写使用依赖注入的代码而不用其考虑PHP-DI ```php class Mailer { public function mail($recipient, $content) { // send an email to the recipient } } ``` ```php class UserManager { private $mailer; public function __construct(Mailer $mailer) { $this->mailer = $mailer; } public function register($email, $password) { // The user just registered, we create his account // ... // We send him an email to say hello! $this->mailer->mail($email, 'Hello and welcome!'); } } ``` 像我们看到的,`UserManager`使用`Mailer`作为构造函数的参数: 这就是依赖注入! ### 2. 创建容器 你可以使用一个容器的实例去让开发更简单一些: ```php $container = DI\ContainerBuilder::buildDevContainer(); ``` 如果你想使用定义文件(下面会解释)或者调整一些配置,你可以使用容器构造器. ```php $builder = new DI\ContainerBuilder(); $builder->... $container = $builder->build(); ``` ### 3. 创建对象 不用PHP-DI,我们将必须"引导"相关依赖像这样: ```php $mailer = new Mailer(); $userManager = new UserManager($mailer); ``` 取而代之的,我们能让PHP-DI来解决依赖: ```php $userManager = $container->get('UserManager'); ``` 在这个场景下,PHP-DI将创建一个Mailer对象和UserManager对象 > 它怎么知道如何去注入? 这个容器使用一个叫做自动**autowiring**的技术,这不是PHP-DI独创的,但是它仍然非场好用.它将扫描代码并查看那些参数在参数在构造函数里.明知一些 在我们的例子中,`UserManager`的构造函数使用了`Mailer`对象: PHP-DI 知道他需要创建一个.很简单,而且非常有效率. > 等等, 像这样奇怪的扫描代码没有风险么? 不用担心,PHP-DI使用[PHP的反射类](http://php.net/manual/en/book.reflection.php)是非常标准的: Laravel, Zend Framework 和其他很多容器也是这么做的,这些信息只读一次然后缓存下来,不会有任何影响. ## 注入定义 我们已经看过**autowiring**,像PHP-DI自动计算出依赖类这种.但是我们有三种方法去定义怎么去注入类: - using [autowiring](autowiring.md) - using [annotations](annotations.md) - using [PHP definitions](php-definitions.md) 随意使用任何一种,这里有一个PHP定义的文件 ```php return [ 'api.url' => 'http://api.example.com', 'Webservice' => function (Container $c) { return new Webservice($c->get('api.url')); }, 'Controller' => DI\object() ->constructor(DI\get('Webservice')), ]; ``` 请阅读[依赖定义](definition.md)文档去了解 autowiring, annotations and PHP definitions. ## 框架中使用 我们已经在上面看了一个使用容器获得对象的例子: ```php $userManager = $container->get('UserManager'); ``` 我们经常不希望在应用中任何地方都需要调用容器,他将使**我们的代码绑定到容器**.这就是大家知道的*服务定位模式* *待继续*