PHP-DI 5:缓存值和定义

时间:2018-02-04 10:15:06

标签: php dependency-injection ioc-container php-di

我正在使用PHP-DI 5依赖注入容器,我已经阅读了有关definitions caching的文档。虽然我在这方面仍然不确定......所以我想问你:

1)如果我直接设置一个对象作为容器中的条目值,该条目是否会被缓存?

$builder = new ContainerBuilder();
$builder->setDefinitionCache(new ApcCache());
$container = $builder->build();

$response = new Response();

// Will this entry be cached?
$container->set(ResponseInterface::class, $response);

2)现在让我们在容器中的定义文件中说对象已经定义

return [
    'response' => function () {
        return new Response();
    },
];

如果我执行以下操作:

$builder = new ContainerBuilder();
$builder->setDefinitionCache(new ApcCache());
$container = $builder->build();

// Will this entry be cached?
$container->set(ResponseInterface::class, DI\get('response'));
  • 将缓存条目,或
  • 会引发错误,或
  • 该条目是否“默默地”未缓存?

非常感谢。

1 个答案:

答案 0 :(得分:0)

似乎你对“缓存”的含义感到困惑。

缓存的内容是 definitions 。定义描述了如何创建对象。它被缓存,因为读取配置文件,或阅读PHP的反射或阅读注释可能很昂贵。

  

1)如果我直接将一个对象设置为容器中的条目值,该条目是否会被缓存?

由于直接设置了对象,因此没有定义。所以没有任何缓存。

  

2)现在假设该对象已在容器中定义,位于定义文件中:

如果定义是一个闭包(匿名函数),那么它就不会被缓存,因为闭包不能存储到缓存中。

如果你使用的不是闭包,那么定义将被缓存,以避免在每次HTTP请求时在运行时读取配置文件。

您是否将缓存与“单身人士”混为一谈?也许this documentation可以提供帮助。