Задать вопрос
@defmin

Как работать с $_ENV?

Некий код

class DotEnv
{
    public function __construct(
        private string          $path,
        private readonly string $separator = '='
    )
    {
        $this->path = rtrim($this->path, '\/') . DIRECTORY_SEPARATOR;
    }

    public function load(string $file = '.env'): void
    {
        $file = $this->path . $file;

        if (!is_file($file)) {
            throw new Exception("Не найден файл настроек: $file");
        }

        $lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach ($lines as $line) {

            if (!str_contains($line, $this->separator)) {
                continue;
            }

            list($key, $value) = explode($this->separator, $line, 2);

            $key = trim($key);
            $value = trim($value);

            $_ENV[$key] = $value;
            
            // а может быть делать так?
            //putenv("$key=$value");
        }
    }
}



Как помещать данные в $_ENV: просто заполнить массив или через putenv()?

Доставалки (вроде работают):

if (!function_exists('env')) {
    function env(string $key = '', mixed $default = null): mixed
    {
        return $key ? array_key_exists($key, $_ENV) ? $_ENV[$key] !== '' ? $_ENV[$key] : $default : false : $_ENV;
    }
}

// второй параметр true, потому что нам нужны ТОЛЬКО ключи заполненные с помощью putenv, если такой вариант использовался
if (!function_exists('env')) {
    function env(string $key, mixed $default = null): mixed
    {
        return getenv($key, true) ?: $default;
    }
}


И ещё такой вопрос: почему я при filter_input(INPUT_ENV, 'ЛЮБОЙ_КЛЮЧ_ДАЖЕ_ЕСЛИ_ТАКОЙ_ЕСТЬ') получаю ВСЕГДА - null?
  • Вопрос задан
  • 118 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
Vamp
@Vamp
Как помещать данные в $_ENV: просто заполнить массив или через putenv()?

Данные туда помещаются автоматически при старте скрипта и при условии, что в php.ini опции variables_order присутствует буква E. Вызов putenv не поместит новый элемент в данный массив, но можно поместить самому напрямую: $_ENV['a'] = 'b';

почему я при filter_input(INPUT_ENV, 'ЛЮБОЙ_КЛЮЧ_ДАЖЕ_ЕСЛИ_ТАКОЙ_ЕСТЬ') получаю ВСЕГДА - null?

Это известный баг в php, которому скоро стукнет 15 лет. Я бы рекомендовал пользоваться суперглобальными массивами вместо filter_input.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы