PHP 8.3: Поддержка резервных значений в синтаксисе переменных PHP INI
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-значения. К ним относятся:
ini_get()
ini_get_all()
ini_set()
get_cfg_var()
parse_ini_string()
parse_ini_file()
Рекурсивные замены
Синтаксис запасной переменной среды также поддерживает переменную среды в качестве значения замены, которая, в свою очередь, может поддерживать и другие переменные замены.
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
не существовала.