# 开始
欢迎!这份指南将帮助你在项目中使用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');
```
我们经常不希望在应用中任何地方都需要调用容器,他将使**我们的代码绑定到容器**.这就是大家知道的*服务定位模式*
*待继续*