Если я определю службу в приложении 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 тысячных секунды (0,05 с на 1 миллион повторений).
Так что разница в производительности не должна учитываться.
Вот прямой ответ: практической разницы нет. Единственный сценарий, который я вижу, где use ($app)
не будет работать, если вы определите некоторые записи в отдельных файлах.
Что следует, просто если вам любопытно;)
Преимущество повторной передачи контейнера в параметрах заключается в том, что он позволяет Silex проходить другой экземпляр контейнера вместо. Silex этого не делает, поэтому не влияет на вас. Но некоторые другие контейнеры делают.
Основная причина для контейнера сделать это, если у вас есть сложная настройка с несколькими контейнерами, которые связаны друг с другом: ParentContainer
-> SubContainer
, Когда вы определяете запись в SubContainer
, вы хотите иметь возможность извлекать зависимости из родительского контейнера (который также будет автоматически искать в подконтейнере). Таким образом, подконтейнер передаст parentcontainer в параметре закрытия.
Это расширенный (и редкий) вариант использования, но интересно знать;)
Других решений пока нет …