Нет лучшего способа, это зависит от того, что вы делаете. Если вы пишете код, в котором вы знаете, что у вас есть доступ к текущему / неявному контексту, такому как веб-часть, вариант № 1 предпочтительнее. Эта «копилка» в текущем контексте быстрее и экономит ресурсы. Пост Рубенса Фариаса предлагает некоторые дополнительные детали относительно ограничений.
Иногда у вас нет текущего / неявного контекста, такого как утилита командной строки. Иногда вы хотите получить доступ к объектам вне текущего контекста, например, в другом веб-приложении. В этих случаях у вас остается опция # 2, которая раскручивает свой собственный контекст.
Я склонен рассматривать вариант № 3 как избыточную и менее выразительную версию варианта № 1. Кто-то может предложить убедительные аргументы в пользу его использования, но я не сталкивался с этим.
Оба подхода (текущий и явный контекст) работают хорошо и должны быть в вашем наборе инструментов. Ключ в том, чтобы знать, почему и как использовать один подход против другого в данной ситуации.