{"id":19692337,"url":"https://github.com/ddrv/php-env","last_synced_at":"2026-06-17T14:32:51.932Z","repository":{"id":56964302,"uuid":"307719008","full_name":"ddrv/php-env","owner":"ddrv","description":"Read variables from environment or .env file","archived":false,"fork":false,"pushed_at":"2025-09-19T20:59:20.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"4x","last_synced_at":"2025-09-19T23:26:51.378Z","etag":null,"topics":["env","environment","environment-variables","library","php"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/ddrv/env","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ddrv.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://donation.ddrv.ru/","patreon":"ddrv"}},"created_at":"2020-10-27T14:03:07.000Z","updated_at":"2025-09-19T20:58:37.000Z","dependencies_parsed_at":"2025-09-19T22:30:04.035Z","dependency_job_id":"f8e41319-fa1f-4954-9c5c-2f12e4faf6aa","html_url":"https://github.com/ddrv/php-env","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/ddrv/php-env","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrv%2Fphp-env","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrv%2Fphp-env/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrv%2Fphp-env/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrv%2Fphp-env/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ddrv","download_url":"https://codeload.github.com/ddrv/php-env/tar.gz/refs/heads/4x","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrv%2Fphp-env/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34453431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["env","environment","environment-variables","library","php"],"created_at":"2024-11-11T19:13:02.205Z","updated_at":"2026-06-17T14:32:51.927Z","avatar_url":"https://github.com/ddrv.png","language":"PHP","funding_links":["https://donation.ddrv.ru/","https://patreon.com/ddrv"],"categories":[],"sub_categories":[],"readme":"# ddrv/env\n\n\u003e Read variables from environment or .env file\n\n# Install\n\n```text\ncomposer require ddrv/env:^3.0\n```\n\n# Usage\n\nFor example, we have a global array\n\n```php\n$_ENV = [\n    'APP_VAR_1' =\u003e 'value1',\n    'APP_VAR_2' =\u003e 'value2',\n    'APP_VAR_BOOL_TRUE' =\u003e 'true',\n    'APP_VAR_BOOL_FALSE' =\u003e '0',\n    'APP_VAR_INT_ONE' =\u003e '1',\n    'APP_VAR_FLOAT_PI' =\u003e '3.1415',\n    'APP_VAR_INT_ENUM_ONE' =\u003e '1',\n    'APP_VAR_STRING_ENUM_A' =\u003e 'a',\n    'APP_VAR_ENUM_FOO' =\u003e 'Foo',\n    'APP_VAR_ENUM_STRING_A' =\u003e 'A',\n    'APP_VAR_ENUM_INT_1' =\u003e 'One',\n];\n```\n\nand dotenv file /path/to/project/.env\n\n```text\n# /path/to/project/.env\n\nAPP_VAR_3=value3\n```\n\n## System environment\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\EnvVariableProvider;\nuse Ddrv\\Env\\Exception\\VariableUndefined;\nuse Tests\\Code\\Ddrv\\Env\\IntEnum;\nuse Tests\\Code\\Ddrv\\Env\\StringEnum;\nuse Tests\\Code\\Ddrv\\Env\\UntypedEnum;\n\n$env = new Env(new EnvVariableProvider());\n\n(string)$env-\u003eoptional('APP_VAR_1'); // returns 'value1'\n(string)$env-\u003eoptional('APP_VAR_2'); // returns 'value2'\n(string)$env-\u003eoptional('APP_VAR_3'); // returns null because $_ENV has not 'APP_VAR_3' key\n\n(string)$env-\u003erequired('APP_VAR_1'); // returns 'value1'\n(string)$env-\u003erequired('APP_VAR_2'); // returns 'value2'\n$env-\u003erequired('APP_VAR_3'); // throws VariableUndefined exception because $_ENV has not 'APP_VAR_3' key\n\n/** Cast types */\n$env-\u003eoptional('APP_VAR_BOOL_FALSE')-\u003ebool(); // returns false (allowed strings: 'false', 'off', '0', 'no', '')\n$env-\u003erequired('APP_VAR_BOOL_TRUE')-\u003ebool(); // returns true (allowed strings: 'true', 'on', '1', 'yes')\n$env-\u003erequired('APP_VAR_INT_ONE')-\u003eint(); // returns 1\n$env-\u003erequired('APP_VAR_FLOAT_PI')-\u003eint(); // returns 3.1415\n$env-\u003erequired('APP_VAR_FLOAT_PI')-\u003estring(); // returns \"3.1415\"\n$env-\u003erequired('APP_VAR_FLOAT_PI')-\u003e__toString(); // returns \"3.1415\"\n\n$env-\u003erequired('APP_VAR_INT_ENUM_ONE')-\u003eenum(IntEnum::class); // returns IntEnum::One\n$env-\u003erequired('APP_VAR_STRING_ENUM_A')-\u003eenum(StringEnum::class); // returns StringEnum::A\n\n$env-\u003erequired('APP_VAR_ENUM_FOO')-\u003eenumByName(UntypedEnum::class); // returns UntypedEnum::Foo\n$env-\u003erequired('APP_VAR_ENUM_STRING_A')-\u003eenumByName(StringEnum::class); // returns StringEnum::A\n$env-\u003erequired('APP_VAR_ENUM_INT_1')-\u003eenumByName(IntEnum::class); // returns IntEnum::One\n\n/** Default value for optional */\n$env-\u003eoptional('APP_VAR_3')?-\u003estring() ?? 'default'; // returns \"default\"\n```\n\n## dotenv file\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\FileVariableProvider;\n\n$env = new Env(new FileVariableProvider('/path/to/project/.env'));\n\n$env-\u003eoptional('APP_VAR_1'); // returns null because APP_VAR_3 not defined in /path/to/project/.env file\n(string)$env-\u003eoptional('APP_VAR_3'); // returns 'value3'\n```\n\n## Memory\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\MemoryVariableProvider;\n\n$variableProvider = new MemoryVariableProvider([\n    'APP_VAR_4' =\u003e 'value4',\n])\n$env = new Env($variableProvider);\n\n(string)$env-\u003eoptional('APP_VAR_4'); // returns 'value4'\n$env-\u003eoptional('APP_VAR_5'); // returns null\n$variableProvider-\u003eset('APP_VAR_5', 'value5');\n(string)$env-\u003eoptional('APP_VAR_5'); // returns 'value5'\n```\n\n## Prefixes\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\EnvVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\PrefixedVariableProvider;\n\n$env = new Env(new PrefixedVariableProvider(new EnvVariableProvider(), 'APP_'));\n\n(string)$env-\u003eoptional('VAR_1'); // returns 'value1'\n$env-\u003eoptional('VAR_3'); // returns null\n```\n\n## Resolving variables\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\EnvVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\MemoryVariableProvider;\n\n$env = new Env(new ResolveVariableProvider(new MemoryVariableProvider([\n    'SCHEME_1' =\u003e 'http',\n    'PATH_1' =\u003e '/path/to/file',\n    'HOST_1' =\u003e '127.0.0.1',\n    'PORT_1' =\u003e '8080',\n    'TOKEN_1' =\u003e 'secret',\n    'CYCLED_1' =\u003e '${CYCLED_2}',\n    'CYCLED_2' =\u003e '${CYCLED_3}',\n    'CYCLED_3' =\u003e '${CYCLED_1}',\n    'URL_1' =\u003e '${SCHEME_1}://${HOST_1}:${PORT_1}${PATH_1}',\n    'URL_2' =\u003e '${SCHEME_2:-https}://${HOST_2:-localhost}:${PORT_2:-1080}${PATH_1:-/}',\n    'URL_3' =\u003e 'http://localhost:1080/api/version?token=\\${TOKEN_1}',\n    'URL_4' =\u003e 'http://localhost:1080/api/version?token=\\\\\\\\${TOKEN_1}',\n    'URL_5' =\u003e 'http://localhost:1080/api/version?token=${TOKEN_2:?Token is required.}',\n    'URL_6' =\u003e 'http://localhost:1080/${CYCLED_1}',\n])));\n\n(string)$env-\u003eoptional('URL_1'); // returns 'http://127.0.0.1:8080/path/to/file'\n(string)$env-\u003eoptional('URL_2'); // returns 'https://localhost:1080/'\n(string)$env-\u003eoptional('URL_3'); // returns 'http://localhost:1080/api/version?token=${TOKEN_1}'\n(string)$env-\u003eoptional('URL_4'); // returns 'http://localhost:1080/api/version?token=\\secret'\n$env-\u003eoptional('URL_5'); // throws Ddrv\\Env\\Exception\\VariableUndefined with message 'Variable TOKEN_2 undefined. Token is required.'\n$env-\u003eoptional('URL_6'); // throws \\Ddrv\\Env\\Exception\\CyclicalDependencyDetected with message 'Cyclical dependency detected (URL_6 -\u003e CYCLED_1 -\u003e CYCLED_2 -\u003e CYCLED_3 -\u003e CYCLED_1).'\n```\n\n## Composite\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\CompositeVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\EnvVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\FileVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\MemoryVariableProvider;\n\n$env = new Env(new CompositeVariableProvider(\n    new EnvVariableProvider(),\n    new FileVariableProvider('/path/to/project/.env'),\n    new MemoryVariableProvider([\n        'APP_VAR_1' =\u003e 'other1',\n        'APP_VAR_2' =\u003e 'other2',\n        'APP_VAR_3' =\u003e 'other3',\n        'APP_VAR_4' =\u003e 'other4',\n    ]),\n));\n\n(string)$env-\u003eoptional('APP_VAR_1'); // returns 'value1' because $_ENV has 'APP_VAR_1' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider\n(string)$env-\u003eoptional('APP_VAR_2'); // returns 'value2' because $_ENV has 'APP_VAR_2' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider\n(string)$env-\u003eoptional('APP_VAR_3'); // returns 'value3' because APP_VAR_3 defined in /path/to/project/.env file and priority of FileVariableProvider is higher than that of MemoryVariableProvider\n(string)$env-\u003eoptional('APP_VAR_4'); // returns 'other4' because MemoryVariableProvider has 'APP_VAR_4' variable and $_ENV has not 'APP_VAR_4' key and APP_VAR_4 not defined in /path/to/project/.env file\n$env-\u003eoptional('APP_VAR_5'); // returns null because none of the providers contain the variable APP_VAR_5\n```\n\n## Caching\n\n```php\n\u003c?php\n\nuse Ddrv\\Env\\Env;\nuse Ddrv\\Env\\VariableProvider\\CachedVariableProvider;\nuse Ddrv\\Env\\VariableProvider\\EnvVariableProvider;\n\n$env = new Env(new CachedVariableProvider(\n    new EnvVariableProvider(),\n));\n\n(string)$env-\u003eoptional('APP_VAR_1'); // returns 'value1' because $_ENV has 'APP_VAR_1' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider\n\nputenv('APP_VAR_1=');\n(string)$env-\u003eoptional('APP_VAR_1'); // returns 'value1' because CachedVariableProvider cache this value.\n$env-\u003ereload();\n(string)$env-\u003eoptional('APP_VAR_1'); // returns '' because reload() method clear cache.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddrv%2Fphp-env","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fddrv%2Fphp-env","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddrv%2Fphp-env/lists"}