4.4. Annotations
注解
除了 自动装配 跟 PHP 配置文件外, 你还可以使用注解定义注入
在使用 编译容器时,使用注解不会影响性能。
安装
注解 默认情况下是禁用的。为了能够使用它们, 您首先需要使用Composer安装 Doctrine Annotations库:
composer require doctrine/annotations
然后,您需要 配置 ContainerBuilder
才能使用它们:
$containerBuilder->useAnnotations(true);
注解是以 PHP 注释的形式编写。 许多现代库和框架都使用它们, 例如 Doctrine, Symfony, PHPUnit…
@Inject
@Inject
让您告诉PHP-DI应该在哪里注入什么,以及应该注入什么。 您可以将其与注释中的@var
和@param
来组合定义应注入的内容。
可以用于:
- 构造函数 (构造函数注入)
- 方法 (setter/method 注入)
- 属性 (属性注入)
*注意: 属性注入是在构造函数执行后发生的, 因此__ construct
中的所有可注入属性都为null。
这是注解@Inject
的所有用法的示例:
class Example
{
/**
* 与注释结合使用的注解:
*
* @Inject
* @var Foo
*/
private $property1;
/**
* 要注入的条目的明确定义:
*
* @Inject("db.host")
*/
private $property2;
/**
* 注解与注释结合使用:
*
* @Inject
* @param Foo $param1
* @param Bar $param2
*/
public function __construct($param1, $param2)
{
}
/**
* 注解与类型提示结合使用:
*
* @Inject
*/
public function method1(Foo $param)
{
}
/**
* 要注入的条目的明确定义:
*
* @Inject({"db.host", "db.name"})
*/
public function method2($param1, $param2)
{
}
/**
* 通过名称明确定义参数:
*
* @Inject({"param2" = "db.host"})
*/
public function method3(Foo $param1, $param2)
{
}
}
注意:使用 use DI\Annotation\Inject;
导入注解是可选的。
@Inject 疑难解答
- 您必须使用双引号 (
"
) 而不是单引号('
),例如:@Inject("foo")
@Inject()
中的内容必须用引号引起来,即使它是类名也是如此:@Inject("Acme\Blog\ArticleRepository")
- 当
@Inject
与@var
或者@param
结合使用时, 请确保在使用命名空间的情况下正确导入了类名 (如果不合规,好的IDE编辑器将显示警告) @Inject
不能用于Container::call()
(会被忽略)
Injectable
@Injectable
让您可以在类上设置可注入选项(是否可以注入):
/**
* @Injectable(lazy=true)
*/
class Example
{
}
@Injectable
是可选的:默认情况下,所有类都是可注入的。
局限性
以下情况不能用注解定义:
- 值 (而不是类)
- 将接口映射到实现
- 为匿名函数定义条目
为此,你可以将注解与 definitions in PHP结合使用。
疑难解答
由于注解位于PHP注释块中, 因此必须将opcache选项opcache.save_comments
设置为 1
。如果设置为 0
,则注释将从源代码中删除,并且注释将不起作用。
此选项的默认值为1
,因此默认情况下所有内容均应正常工作。
要检查此选项的值,可以运行以下命令:
$ php -i | grep "opcache.save_comments"
此外,请注意注释是区分大小写的。您应该写@Inject
和@Injectable
而不是@inject
和@injectable
,以避免某些系统上的错误。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。