Skip to content

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/main
DB_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["литеральный $"]
Loading

Жизненный цикл

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 (\$ → $)
Loading

Сравнение с аналогами

Возможность Env vlucas symfony josegonzalez m1 devcoder 🏆 Победитель
Интерполяция ${VAR} ⚠️ ⚠️ Env, vlucas, symfony
Экранирование \$ Env, vlucas, symfony
Защита от подстановки команд Паритет

Clone this wiki locally