Silex 服务 - $app 参数或 "use ($app)" 语句?
Silex service - $app parameter or "use ($app)" statement?
如果我在 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']);
};
我见过很多此类代码的示例。这只是个人品味,还是其中一个比另一个有优势,例如在性能、内存使用或代码隔离方面?
编辑:
我有 运行 "use" 与参数与简单函数的性能比较:
$func = function () use ($app) {...};
$func = function ($app) {...};
function test($app) {...}
第一个是最慢的,但总体差异小于25%。和任何微优化一样,只有当你有数以万计的微优化时,它才会引人注目,因为最快和最慢之间的时间差约为 1/10,000,000 秒(100 万次重复为 0.05 秒)。
所以不应该考虑性能差异。
这是一个直接的答案:没有实际区别。我能看到 use ($app)
不起作用的唯一情况是如果您在单独的文件中定义一些条目。
接下来就是好奇了;)
在参数中再次传递容器的好处是它允许 Silex 传递另一个容器实例。 Silex 不会那样做,所以它不会影响您。但是其他一些容器可以。
容器这样做的主要原因是,如果您有一个包含多个容器的复杂设置,这些容器一个接一个地链接在一起:ParentContainer
-> SubContainer
。当您在 SubContainer
中定义一个条目时,您希望能够从父容器中获取依赖项(它也会自动在子容器中查找)。所以子容器会在闭包参数中传递父容器。
这是一个高级(且罕见)的用例,但了解它很有趣 ;)
如果我在 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']);
};
我见过很多此类代码的示例。这只是个人品味,还是其中一个比另一个有优势,例如在性能、内存使用或代码隔离方面?
编辑: 我有 运行 "use" 与参数与简单函数的性能比较:
$func = function () use ($app) {...};
$func = function ($app) {...};
function test($app) {...}
第一个是最慢的,但总体差异小于25%。和任何微优化一样,只有当你有数以万计的微优化时,它才会引人注目,因为最快和最慢之间的时间差约为 1/10,000,000 秒(100 万次重复为 0.05 秒)。
所以不应该考虑性能差异。
这是一个直接的答案:没有实际区别。我能看到 use ($app)
不起作用的唯一情况是如果您在单独的文件中定义一些条目。
接下来就是好奇了;)
在参数中再次传递容器的好处是它允许 Silex 传递另一个容器实例。 Silex 不会那样做,所以它不会影响您。但是其他一些容器可以。
容器这样做的主要原因是,如果您有一个包含多个容器的复杂设置,这些容器一个接一个地链接在一起:ParentContainer
-> SubContainer
。当您在 SubContainer
中定义一个条目时,您希望能够从父容器中获取依赖项(它也会自动在子容器中查找)。所以子容器会在闭包参数中传递父容器。
这是一个高级(且罕见)的用例,但了解它很有趣 ;)