4

如果我在 Silex 应用程序中定义服务,我可以期望主容器(应用程序)作为参数传递,也可以使用“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 秒)。

所以不应该考虑性能差异。

4

1 回答 1

3

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

如果您好奇,接下来的内容就是;)

在参数中再次传递容器的好处是它允许 Silex 改为传递另一个容器实例。Silex 不这样做,因此它不会影响您。但是其他一些容器可以。

容器这样做的主要原因是,如果您有一个复杂的设置,其中有多个容器一个接一个地链接:ParentContainer-> SubContainer。当您在 中定义条目时SubContainer,您希望能够从父容器中获取依赖项(它也会自动在子容器中查找)。所以子容器会在闭包参数中传递父容器。

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

于 2015-04-10T12:57:30.677 回答