Silex服务 - $ app参数或"使用($ app)"声明?

时间:2015-04-06 20:47:04

标签: php dependency-injection silex pimple php-closures

如果我在Silex应用程序中定义一个服务,我可以期望主容器(Application)作为参数传递,或者可以使用“use($ app)”语句从当前范围中获取它。

http://silex.sensiolabs.org/doc/services.html上的官方文档包含以下代码:

$app['some_service'] = function ($app) {
     return new Service($app['some_other_service'], $app['some_service.config']);
};

但它可以同样写成

$app['some_service'] = function () use ($app) {
     return new Service($app['some_other_service'], $app['some_service.config']);
};

我已经看过很多这样的代码示例。它只是个人品味,还是其中一种比其他产品更有优势,例如性能,内存使用或代码隔离?


修改 我运行了“使用”与参数与简单函数的性能比较:

$func = function () use ($app) {...};
$func = function ($app) {...};
function test($app) {...}

第一个是最慢的,但整体差异小于25%。和任何微观优化一样,只有当你拥有成千上万的这些时才会引人注意,因为最快和最慢之间的时差约为1 / 10,000,000秒(100万代表为0.05)。

因此不应考虑性能差异。

1 个答案:

答案 0 :(得分:3)

这是一个直接的答案:没有实际的区别。我可以看到use ($app)无法工作的唯一情况是,如果您在单独的文件中定义某些条目。

以下是你好奇的事情;)

在参数中再次传递容器的好处是它允许Silex传递另一个容器实例。 Silex不这样做,所以它不会对你产生影响。但是其他一些容器也可以。

容器执行此操作的主要原因是,如果您有一个复杂的设置,其中有多个容器一个接一个地链接:ParentContainer - > SubContainer。在SubContainer中定义条目时,您希望能够从父容器中获取依赖项(它将自动查看子容器中的内容)。因此,子容器将在closure参数中传递parentcontainer。

这是一个高级(且罕见)的用例,但知道它很有趣;)