最安全方式是用require加载PHP配置文件并接收返回值,因include不捕获return值、依赖全局变量易冲突、出错仅警告不中断执行;正确做法是配置文件末尾return数组,require显式赋值并校验类型。

直接用 require 加载 PHP 格式配置文件,然后接收返回值——这是最安全、最可控的方式。
为什么不能用 include 直接取变量?
很多人写 include 'config.php'; echo $db_host;,看似能跑通,但隐患极多:
- 如果
config.php里有return语句(推荐写法),include不会捕获返回值,$db_host实际是未定义的 - 如果
config.php没加return,靠全局变量传递,一旦被多次include就可能覆盖或冲突 -
include出错只发警告,脚本继续执行,后续读不到配置却没报错,排查困难
正确做法:用 require + return 数组
配置文件应是一个「纯数据导出脚本」,末尾必须 return 一个数组:
<?php
return [
'db_host' => 'localhost',
'debug' => true,
'timeout' => 30,
];
加载时必须显式接收返回值,并做类型检查:
立即学习“PHP免费学习笔记(深入)”;
$config = require 'config.php';
if (!is_array($config)) {
throw new RuntimeException('Config file must return an array');
}
echo $config['db_host']; // 安全访问
- 用
require而非require_once:避免因缓存或重复加载导致配置被跳过 - 不依赖
include_path:路径写相对或绝对,更可控;若真要用include_path,确保set_include_path()在加载前已生效 - 禁止在配置文件中写
echo、var_dump或任何输出,否则触发headers already sent
常见错误路径问题:include_path 并不总是生效
你以为设了 include_path 就能直接 require 'config.php',但实际常失败,原因很具体:
- 如果路径含
./或../(如require './config.php'),PHP 会完全忽略include_path,只在当前工作目录找 - 如果
config.php在子目录里(如config/production.php),而你只把config/加进include_path,那仍需写require 'production.php',不能写require 'config/production.php' -
get_include_path()返回的是字符串,不是数组,拼接新路径时别漏掉PATH_SEPARATOR
环境区分配置不要靠 if 判断主机名
在配置文件里写 if ($_SERVER['HTTP_HOST'] === 'prod.example.com') 是危险的:
- 开发机 hosts 绑定生产域名就直接切到生产配置,容易误操作
- CLI 环境下
$_SERVER['HTTP_HOST']为空,逻辑崩坏 - Git 提交时极易把生产密钥带出去
正确方式是入口文件(如 index.php)决定加载哪个配置:
$env = $_ENV['APP_ENV'] ?? 'dev';
$config = require "config/{$env}.php";
环境变量由 Web 服务器或容器注入(Nginx 用 fastcgi_param APP_ENV prod,Docker 用 environment: APP_ENV=prod),PHP 进程启动后即可读取。
配置加载本身很简单,难的是路径解析规则、作用域继承机制和环境隔离设计——这三个点踩错一个,调试时间就翻倍。



















