1

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

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'));
  • 条目是否会被缓存,或者
  • 是否会引发错误,或者
  • 条目会“静默”不被缓存吗?

非常感谢你。

4

1 回答 1

0

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

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

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

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

2) 现在假设对象已经在容器中的定义文件中定义:

如果定义是像您的示例中的闭包(匿名函数),那么它将不会被缓存,因为闭包不能存储到缓存中。

如果您使用闭包以外的其他东西,那么定义将被缓存以避免在运行时在每个 HTTP 请求上读取配置文件。


您是否将缓存与“单例”混淆了?也许这个文档可以提供帮助。

于 2018-02-06T07:05:13.123 回答