PHP读取Properties文件需逐行解析,跳过注释与空行,按首个=或:分割键值,并正确处理uXXXX及 等转义;写入时须转义特殊字符并统一用LF换行,推荐封装50行内静态方法实现。

PHP怎么读取Properties文件内容
PHP标准库不原生支持 .properties 文件格式,必须手动解析。最稳妥的方式是逐行读取、跳过注释和空行、按 = 或 : 分割键值,并处理转义(如 uXXXX、
)。不要用 parse_ini_file(),它只认 .ini 格式,强行用会丢键、乱码、忽略注释后内容。
常见错误现象:file_get_contents() 读出来全是字符串但没拆成数组;用 explode('=', $line) 没考虑值里含等号(如 url=http://example.com?a=1&b=2);遇到 # key=value 这种注释在行中直接当键值处理。
- 用
file()按行读取,保留换行符便于后续 trim 和判断 - 跳过以
#或!开头的行(Java Properties 规范允许这两种注释) - 对非空行,先
trim(),再找第一个=或:的位置,用substr()分离键和值,避免误切值内符号 - 对值部分调用自定义函数处理转义:比如
str_replace(['\n', '\t'], [" ", " "], $value),Unicode 转义需用mb_convert_encoding()配合正则
PHP怎么安全写入Properties文件
写入比读取更易出错——没有标准库帮你 escape 键和值,直接拼接会导致文件损坏或加载失败。核心原则是:键不能含 =、:、空格前缀/后缀;值中的换行、制表符、反斜杠、Unicode 必须显式转义;每行结尾必须是
(LF),Windows 换行符
在某些 Java 加载器里会被截断。
使用场景:配置同步、多语言文案导出、与 Java 服务共享配置。若只是 PHP 内部用,建议改用 .php 返回数组或 JSON,省去解析开销。
立即学习“PHP免费学习笔记(深入)”;
- 键名用
trim($key)去首尾空白,再检查是否为空或含=:—— 含则抛异常,别静默替换 - 值部分先做 Unicode 转义(
u0041),再将、、、、替换为对应转义序列 - 写入前用
is_writable()检查目录权限,用file_put_contents($path, $content, LOCK_EX)防并发覆盖 - 避免用
fopen(..., 'a')追加——容易在中间插入导致格式错乱;始终重写整个文件
有没有轻量可用的第三方库
有,但得挑。推荐 neitanod/forceutf8 不相关,symfony/yaml 是 YAML。真正可用的是 hobodo/properties(仅读)或自己封装的 50 行类。不建议引入全量 java-properties 类库——依赖多、文档少、PHP 8.1+ 兼容性差。
性能影响:纯 PHP 解析 10KB 文件耗时约 0.5–2ms,比 json_decode() 慢 3–5 倍,但远快于 shell_exec('java -cp ...') 调用外部命令。
-
composer require "hobodo/properties:~1.0"可读,但不支持写、不处理 Unicode 转义 - 若项目已用
symfony/filesystem,可复用其dumpFile()做原子写入,但解析仍要自己写 - 最简方案:把读写逻辑封装成两个静态方法,放在
src/Util/Properties.php,50 行内搞定,维护成本最低
Java和PHP处理Properties的差异点
这是最容易踩坑的地方:Java 的 java.util.Properties 默认 ISO-8859-1 编码读取,遇到 UTF-8 中文会显示为 u4F60u597D;而 PHP 用 file_get_contents() 默认按字节读,编码取决于文件保存格式。两者不统一,配置就乱码。
兼容性影响:PHP 写出的文件若含中文但没转义为 uXXXX,Java 加载会报 Invalid Unicode sequence;反过来,Java 写出的带 u 转义的文件,PHP 若不解析,读出来就是字面字符串。
- PHP 读 Java 生成的 .properties:必须识别并转换
uXXXX,用preg_replace_callback('/\\u([0-9a-fA-F]{4})/', fn($m) => mb_chr(hexdec($m[1]), 'UTF-8'), $value) - PHP 写给 Java 用的文件:中文必须转
uXXXX,不能直接写 UTF-8 字节;英文字符和数字无需转义 - 跨语言协作时,约定文件编码为 UTF-8 + u 转义,比搞 BOM 或编码声明更可靠
真正麻烦的不是读写逻辑,而是编码和转义规则对不齐。哪怕只改一行配置,也要确认两边的 Properties 处理函数是否用了同一套 Unicode 解析逻辑。



















