PHP 8.3: Поддержка резервных значений в синтаксисе переменных PHP INI

Источник: «PHP 8.3: Fallback value support for PHP INI Environment Variable syntax»
PHP поддерживает замену значений PHP INI на переменные окружения с помощью синтаксиса строковой интерполяции PHP. Если указанная переменная окружения недоступна, парсер INI использует пустую строку. В PHP 8.3 этот синтаксис расширен для поддержки объявления запасного/fallback значения, если переменная окружения не установлена.
session.name = ${SESSION_NAME}
sendmail_from = "${MAIL_FROM_USER}@${MAIL_FROM_DOMAIN}"
ini_get('session.name');
ini_get('sendmail_from');

Все версии PHP поддерживают приведённый выше синтаксис для использования переменных окружения в INI-файлах PHP. В данном случае INI-значение session.name будет установлено в переменную окружения SESSION_NAME, если она установлена, или в пустую строку в противном случае. Значение sendmail_from использует строковую интерполяцию, и PHP подставляет доступные переменные окружения вместе с символом @ в середине.

PHP не выдаёт никаких предупреждений при запуске или разборе, если переменные окружения отсутствуют, всегда заменяет их пустой строкой.

В PHP 8.3 поддержка подстановки переменных окружения INI расширена за счёт поддержки объявления запасного значения.

В PHP 8.3 и более поздних версиях появилась возможность опционально объявлять запасное (fallback) значение с помощью символа :-, за которым следует запасное значение. Те же значения INI, которые были объявлены в приведённом выше фрагменте, теперь могут быть заданы с помощью запасных значений:

session.name = ${SESSION_NAME:-Foo}
sendmail_from = "${MAIL_FROM_USER:-info}@${MAIL_FROM_DOMAIN:-example.com}"
ini_get('session.name');
ini_get('sendmail_from');

PHP 8.3 анализирует эти значения с поддержкой запасных (fallback) значений, указанных после символа :-.

Например, значение session.name будет значением переменной окружения SESSION_NAME, если она установлена, но в противном случае теперь используется значение Foo.

Значение sendmail_from также вернётся к info@example.com, если не установлены переменные окружения MAIL_FROM_USER и MAIL_FROM_DOMAIN. Если одна из них доступна, то будет использована переменная окружения.

Поддерживаемые функции

Синтаксис запасного значения поддерживается во всех функциях PHP, которые возвращают, устанавливают и разбирают INI-значения. К ним относятся:

Рекурсивные замены

Синтаксис запасной переменной среды также поддерживает переменную среды в качестве значения замены, которая, в свою очередь, может поддерживать и другие переменные замены.

session.name = ${SESSION_NAME:-${APP_NAME:-Login}}

В этом объявлении PHP использует переменную окружения SESSION_NAME, если она доступна. В противном случае PHP пытается использовать переменную APP_NAME, если она доступна. Наконец, в качестве запасного варианта используется Login.

Константы PHP как запасные значения

Для значений PHP INI, поддерживающих их изменение во время выполнения, синтаксис INI также поддерживает использование констант PHP в качестве запасного значения:

define('APP_NAME', "MyApp");
parse_ini_string('name = ${SESSION_NAME:-APP_NAME}');
[
"name" => "MyApp",
]

Приведение типа

PHP пытается принудительно использовать запасные значения, следуя тем же правилам, что и для стандартных строковых литералов конфигурации.

true_true = true
true_fallback = ${FOOBAR:-true}

Все приведённые выше значения при обработке принудительно приводятся к "1".

false_false = false
false_fallback = ${FOOBAR:-false}

Все приведённые выше значения при разборе приводятся к "" (а не к "0").

null константы и несуществующие переменные среды заменяются пустой строкой ("")

Вопросы безопасности

Даже до этого изменения обработка пользовательских и произвольных значений INI должна быть проверена на отсутствие в них значений окружения, которые не должны быть раскрыты пользователю.

С новым изменением в синтаксисе появилась поддержка констант PHP, что также должно быть тщательно продумано.

Влияние на обратную совместимость

Новый синтаксис не может быть перенесён на старые версии PHP. Однако пользовательский парсер INI может имитировать такое поведение, корректно интерполируя значения с помощью синтаксиса ${FOO:-BAR}.

При попытке разобрать INI-строки и файлы, использующие этот новый синтаксис, не будет возникать никаких исключений или ошибок. Они будут молча заменены пустой строкой, как если бы переменная окружения с именем FOO:-BAR не существовала.


Реализация

Дополнительные материалы

Предыдущая Статья

Как использовать CSS background-size и background-position

Следующая Статья

Как работает Интернет