Сервис Silex - параметр $app или оператор "use ($app)"?

Если я определю службу в приложении 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 миллион повторений).

Так что разница в производительности не должна учитываться.

1 ответ

Решение

Вот прямой ответ: практической разницы нет. Единственный сценарий, который я вижу, где use ($app) не будет работать, если вы определите некоторые записи в отдельных файлах.

Что следует, просто если вам любопытно;)

Преимущество повторной передачи контейнера в параметрах заключается в том, что он позволяет Silex передавать другой экземпляр контейнера. Silex этого не делает, поэтому не влияет на вас. Но некоторые другие контейнеры делают.

Основная причина для контейнера сделать это, если у вас есть сложная настройка с несколькими контейнерами, которые связаны друг с другом: ParentContainer -> SubContainer, Когда вы определяете запись в SubContainer, вы хотите иметь возможность извлекать зависимости из родительского контейнера (который также будет автоматически искать в подконтейнере). Таким образом, подконтейнер передаст parentcontainer в параметре закрытия.

Это расширенный (и редкий) вариант использования, но интересно знать;)

Другие вопросы по тегам