-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Interpolation
github-actions[bot] edited this page Jul 16, 2026
·
1 revision
Ссылки ${VAR}/$VAR внутри значений с экранированием \$ и защитой от
подстановки команд — составные значения (URL, DSN) собираются из атомарных переменных.
Подстановка берёт значение из уже разобранных переменных того же файла, а при
отсутствии — из внешнего источника (системного окружения). Интерполяция применяется
до снятия экранирования, поэтому \$ не подставляется, а становится литеральным $.
use CloudCastle\Env\Env;
Env::load(__DIR__ . '/.env');
Env::getString('DATABASE_URL'); // postgres://app@127.0.0.1:5432/mainDB_HOST=127.0.0.1
DB_PORT=5432
DATABASE_URL=postgres://app@${DB_HOST}:${DB_PORT}/main
PRICE="\$5.00"- Обе формы:
${VAR}(явная граница) и$VAR. - Экранирование
\$защищает литеральные доллары (пароли, цены). - Отсутствующая переменная подставляется как пустая строка — предсказуемо, без ошибок.
- Подстановка команд не выполняется:
$(whoami)и`id`остаются литералами.
- Не рекурсивно по построению: ссылка на переменную, которая сама содержит
${…}, не раскрывается повторно (защита от «интерполяционной бомбы»). - Внутри одинарных кавычек интерполяция намеренно отключена.
- Собирать составные значения (URL, DSN) из атомарных переменных — проще переопределять части в разных окружениях.
- Двойные кавычки для значений, требующих подстановки.
- Ожидать подстановку внутри одинарных кавычек:
WRONG='${DB_HOST}'останется литералом. - Хранить в
.envзначения, зависящие от рекурсивного раскрытия нескольких уровней.
flowchart LR
V["значение с ${VAR}"] --> R["resolve: known → resolver"]
R -->|"есть"| S["подстановка значения"]
R -->|"нет"| E["пустая строка"]
R -->|"\$"| L["литеральный $"]
sequenceDiagram
participant P as EnvParser
participant K as known (файл)
participant X as resolver (окружение)
P->>P: найти ${VAR}/$VAR (не экранированные)
P->>K: значение VAR?
K-->>P: есть → подставить
P->>X: иначе — resolver(VAR)
X-->>P: значение или null → ''
P->>P: unescape (\$ → $)
| Возможность | Env | vlucas | symfony | josegonzalez | m1 | devcoder | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
Интерполяция ${VAR}
|
✅ | ✅ | ✅ | ❌ | Env, vlucas, symfony | ||
Экранирование \$
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | Env, vlucas, symfony |
| Защита от подстановки команд | ✅ | ✅ | ✅ | ✅ | ✅ | — | Паритет |
CloudCastle Env · · PHP 8.1+
GitHub · Packagist · Releases · Discussions
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)