$_ENV['TEST'] = 'Да тута я, тута!';
var_dump($_ENV['TEST'], filter_input(INPUT_ENV, 'TEST')); // string 'Да тута я, тута!' (length=27), null
if (!function_exists('env')) {
function env(string $key, mixed $default = null): mixed
{
return filter_input(INPUT_ENV, $key) ?: $default;
}
}
variables_order
добавить букву E
$_ENV
, а затем фильтровать через filter_var, так как у filter_input есть баг, что не во всех окружениях он работает корректно и всё равно возвращает null. Плюс поведение не соответствует документации - функция возвращает null для несуществующих переменных, хотя согласно документации должна возвращать false. для несуществующих переменных, хотя согласно документации должна возвращать false
$_GET['test'] = 666; // просто взяли и нахулиганили руками
var_dump(filter_has_var(INPUT_GET, 'test'), filter_input(INPUT_GET, 'test', FILTER_NULL_ON_FAILURE)); // false, null (потому что false с флагом на null)
// переходим по ссылке /?test=666 - хулиганства нет, filter_input задетектирует, что прилёт совершён именно методом GET
var_dump(filter_has_var(INPUT_GET, 'test'), filter_input(INPUT_GET, 'test')); // true, 666
баг даже не в null, а в том что INPUT_ENV не детектирует массив $_ENVИ не должен детектировать. Об этом написано в документации:
WarningБерётся "оригинальный" контент, а не данные из $_ENV. Другими словами, при старте скрипта все переменные окружения копируются в $_ENV, а функции типа getenv и filter_input работают с тем самым местом, откуда эти переменные окружения копировались, а не с $_ENV.
The content of the superglobal that is being filtered is the original "raw" content provided by the SAPI, prior to any user modification to the superglobal. To filter a modified superglobal use filter_var() instead.
Об этом написано в документации
$_ENV['TEST'] = 666;
var_dump(filter_has_var(INPUT_ENV, 'TEST')); // false
// перешли по ссылке /?test=666
var_dump(filter_input(INPUT_GET, 'test')); // 666
Что нужно сделать с массивом $_ENV, чтобы получить значение $_ENV['TEST'] с помощью filter_input(INPUT_ENV, 'TEST') ?Ничего вы с этим не сделаете. Функция filter_input не работает с $_ENV.
вы опять путаетесь, этот варнинг написан для глобальных массивов, которые РЕКОМЕНДУЕТСЯ ФИЛЬТРОВАТЬ с помощью filter_var, если в них были внесены изменения, а нужно ПОЛУЧИТЬВы пишете про вторую часть ворнинга, где советуют применять filter_var на $_ENV, чтобы иметь возможность работать с пользовательскими модификациями массива $_ENV. В первой же части написано как раз про то, что filter_input being filtered is the original "raw" content provided by the SAPI. То есть filter_input берёт данные напрямую из SAPI. Не из $_ENV.
<?php // test.php
var_dump(ini_get('variables_order'));
var_dump(filter_input(INPUT_ENV, 'HELLO'));
var_dump(getenv('HELLO'));
var_dump($_ENV['HELLO']);
export HELLO=123
php test.php
/home/vamp/test.php:2:
string(5) "EGPCS"
/home/vamp/test.php:3:
string(3) "123"
/home/vamp/test.php:4:
string(3) "123"
/home/vamp/test.php:5:
string(3) "123"
Чтобы filter_input заработал вместе с INPUT_ENV, нужно в php.ini опцию variables_order добавить букву E
E
не заполняется массив $_ENV в том числе. php -d 'variables_order=EGPCS' test.php
. Через ini_set эту настройку устанавливать бессмысленно, так как проверка опции variables_order и заполнение массива $_ENV происходит ещё до того как выполнится хотя бы одна строка вашего скрипта. Через ini_set эту настройку устанавливать бессмысленно
filter_input()
, не?