需先确认PHP版本再安装对应phpdotenv版本:PHP 7.4及以下用composer require vlucas/phpdotenv:^4.3,PHP 8.0+可用默认v5.x;安装后须引入vendor/autoload.php,并在所有业务代码前调用对应API加载.env文件。

直接用 composer require vlucas/phpdotenv 就行,但别急着写 Dotenv::create() —— PHP 版本、加载时机和 .env 文件位置稍有偏差,就会报 Class "Dotenv\Dotenv" not found 或变量根本没生效。
为什么 composer require vlucas/phpdotenv 后还找不到类?
常见原因是:PHP 版本低于 8.0,而新版 vlucas/phpdotenv(v5.6+)已放弃对 PHP 7.x 的支持。Composer 默认装最新版,但你的环境可能不兼容。
- PHP 7.4 或更低 → 必须指定旧版本:
composer require vlucas/phpdotenv:^4.3 - PHP 8.0+ → 可用
composer require vlucas/phpdotenv(默认装 v5.x) - 装完后检查
vendor/autoload.php是否已被引入 —— 没 include 它,类永远找不到
怎么正确加载 .env 文件?v4 和 v5 的 API 差太多
v4 和 v5 的初始化方式不兼容,混用会直接报错。关键看 vendor/vlucas/phpdotenv/CHANGELOG.md 里写的主版本号。
- v4(PHP 7.x):
$dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); - v5(PHP 8.0+):
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); - 注意
__DIR__指的是 .env 所在目录,不是项目根目录 —— 如果 .env 在config/.env,就得传__DIR__ . '/config' - 必须在所有业务代码(尤其是依赖环境变量的配置初始化)之前调用
load()
为什么 $_ENV / $_SERVER 里还是看不到变量?
Dotenv 默认只写入 $_ENV,且 PHP 配置 variables_order 中若不含 E,$_ENV 就是空的;另外,某些 SAPI(如 CLI 下的某些 PHP-FPM 配置)会清空 $_ENV。
- 安全起见,推荐统一读
getenv('DB_HOST'),它能跨 SAPI 工作 - 如果坚持用
$_SERVER,v5 要加->usePutenv(true):Dotenv\Dotenv::createImmutable(__DIR__)->usePutenv(true)->load(); - 别在 .env 里写
export DB_HOST=xxx——phpdotenv不解析 export 语法,只认DB_HOST=xxx
最常被忽略的是加载顺序:哪怕路径、版本、语法全对,只要在 require 'vendor/autoload.php' 之后才调用 Dotenv::createImmutable()->load(),而框架或配置文件又在 autoload 时就去读 getenv(),变量就必然为空。把 dotenv 加载逻辑放到入口文件(如 index.php 或 public/index.php)最顶端,别封装进类或延迟执行。










