应使用 var_export() 而非 serialize() 生成 PHP 配置文件,因其输出合法 PHP 语法、可读可编辑可直接 include;需手动格式化换行缩进、包裹 <?php 和 return、过滤闭包/资源/常量等不安全值,并确保 UTF-8 编码与路径安全。

为什么不用 serialize() 而用 var_export()
因为要生成**可读、可编辑、可被 include 直接加载的 PHP 配置文件**。serialize() 输出的是二进制安全字符串,人类不可读,也不能直接当 PHP 代码执行;而 var_export() 生成的是合法 PHP 语法,输出结果本身就是一个数组字面量,复制粘贴就能运行。
注意:var_export() 默认返回 NULL(不输出),必须显式设第二个参数为 false 才返回字符串;设为 true 会直接打印,不适合写入文件。
如何安全写出带换行缩进的配置文件
直接 file_put_contents('config.php', var_export($arr, true)) 会生成一行超长内容,没有缩进、无注释、难维护。需要手动包裹和格式化:
- 开头加
<?php声明,避免被 Web 服务器直接解析为纯文本暴露 - 用
var_export($arr, true)获取原始导出字符串,再用str_replace()或preg_replace()插入换行与空格(简单场景可用print_r($arr, true)+ 正则,但var_export更可靠) - 实际推荐:调用一次
var_export(),然后用eval()验证是否语法合法(仅开发时!不要在生产环境eval用户数据) - 写入前检查目标目录是否可写,否则
file_put_contents静默失败
var_export() 对特殊值的处理要注意什么
它对 null、TRUE、FALSE、数字、字符串都处理得干净,但以下情况容易出问题:
立即学习“PHP免费学习笔记(深入)”;
- 含闭包(
Closure)或资源(resource)的数组会触发致命错误——必须提前过滤掉 - 对象默认不导出属性值,除非该对象实现了
__set_state()静态方法;否则会输出stdClass::__set_state(array( ... ))这类不可执行结构 - 中文键名或值在 PHP 文件中需确保文件编码为 UTF-8 且无 BOM,否则
include时可能报Parse error: syntax error - 如果数组里有定义过的常量(如
APP_ENV),var_export()不会自动转成字符串,而是原样输出名字——这会导致运行时报错,应提前用defined()+constant()替换
完整可复用的保存函数示例
下面是一个最小可行函数,兼顾可读性、安全性与实用性:
function write_php_config(string $path, array $data): bool
{
$export = var_export($data, true);
$content = "<?php\nreturn {$export};";
return (bool) file_put_contents($path, $content . "\n");
}
调用方式:write_php_config('config/database.php', ['host' => 'localhost', 'port' => 3306]);
生成的文件可以直接 include 或 require,返回数组,无需 eval 或 json_decode。关键点在于:结尾加了 return,让配置文件变成「可执行表达式」,这是 PHP 配置文件最轻量也最常用的模式。
别忘了:路径权限、PHP 版本兼容性(var_export 在 PHP 5.4+ 对数组键名的引号处理更一致)、以及上线前确认配置文件不在 Web 可访问路径下——这些比格式本身更容易导致故障。



















