2015-04-06 13 views
4

如果我在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']); 
}; 

,我已經看到了很多這樣的例子代碼。這僅僅是個人愛好,還是其中一種對性能,內存使用或代碼隔離有好處?


編輯: 我已經運行的 「使用」 perfromance比較VS參數VS簡單的函數:

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

第一種是最慢的,但總體差小於25% 。而任何微觀優化,只有當你有成千上萬的微觀優化時,纔會引人注意,因爲最快和最慢之間的時間差約爲1/1000萬分之一秒(對於100萬次的0.05秒)。

因此不應考慮性能差異。

+0

只是讓你知道,暗瘡容器(其中Silex的適用範圍擴大)不得不本身(容器)傳遞給能力服務來自非常[第一版](https://github.com/silexphp/Pimple/commit/e677a530fd580e5e6036c7e0b9ce994b06480fee#diff-553037d9adc48bbece4ab185700cf095R19)。我認爲這是首選的方式,因爲您不需要將父範圍變量導入到clousure中,這應該更有效率(儘管我沒有測試過)。讓我們等待,如果有人提供比我的評論更好的答案:-) – mTorres

回答

3

下面是一個直接的答案:沒有實際區別。我可以看到use ($app)不起作用的唯一場景是如果您在單獨的文件中定義了一些條目。

接下來就是如果你是好奇;)

再次通過容器中的參數的優點在於,它允許Silex的傳遞代替其他容器實例。 Silex不這樣做,所以它不會影響你。但其他一些容器呢。

容器做這件事的主要原因是如果你有一個複雜的設置與多個容器鏈接在一起:ParentContainer - >SubContainer。當您在SubContainer中定義條目時,您希望能夠從父容器中提取依賴項(它也會自動查看子容器)。所以子容器將在閉包參數中傳遞parentcontainer。

這是一種先進的(和罕見的)的使用情況,但它也同樣吸引知道;)

+0

謝謝。我想過在參數中傳遞不同容器的可能性,但是找不到使用它的任何實際方法。特別是Pimple總是將自己納入關閉 - 根本無法通過其他任何方式,如分包商。但我理解,理論上其他一些容器可以做到這一點。 – astax