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,以避免某些系统上的错误。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/php-di/6.0/anno...

译文地址:https://learnku.com/docs/php-di/6.0/anno...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~