phpEnv中JSON扩展未启用是“json_encode未定义”的根本原因,需确认PHP版本、检查php.ini中extension=php_json.dll配置及ext目录下DLL文件是否存在,缺失则需手动补充或更换版本。

phpEnv 是 Windows 下的 PHP 多版本环境管理工具,它本身不自带 JSON 扩展开关界面,JSON 支持依赖底层 PHP 版本是否启用 json 扩展。PHP 5.2.0 起已内置该扩展,但 phpEnv 安装的某些精简版或旧版 PHP(如 PHP 5.3 x86 VC9)可能默认未加载 —— 这才是你遇到“json_encode 未定义”或“Call to undefined function json_encode()”的根本原因。
确认当前 phpEnv 使用的 PHP 版本和扩展路径
先搞清你在用哪个 PHP 实例:打开 phpEnv 控制面板 → 查看“当前运行版本”,记下显示的 PHP 路径(例如 C:\phpEnv\php\php-7.4.33-Win32-vc15-x64)。然后做两件事:
- 执行
php --ini(在该版本目录下的命令行中运行),确认Loaded Configuration File指向的php.ini文件位置 - 检查该
php.ini所在目录的上两级,找到ext子目录,确认里面是否存在php_json.dll(Windows)或json.so(极少出现在 phpEnv 的 Linux 模拟环境里)
如果 ext 目录里没有 php_json.dll,说明这个 PHP 构建包本身就没打包 JSON 扩展 —— 此时不能靠“启用”解决,得换版本或手动补文件。
在 phpEnv 中启用 json 扩展的正确操作步骤
多数情况下,你只需修改对应版本的 php.ini 即可。注意:phpEnv 每个 PHP 版本都有独立的 php.ini,改错文件无效。
立即学习“PHP免费学习笔记(深入)”;
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 用记事本或 VS Code 打开刚才
php --ini显示的php.ini - 搜索
;extension=php_json.dll,去掉开头分号,改为extension=php_json.dll - 再搜
extension_dir,确保它指向正确的扩展目录,例如:extension_dir = "ext"(路径是相对于 PHP 安装根目录的,不是绝对路径) - 保存文件,回到 phpEnv 面板,点击“重启 Apache”或“重启 Nginx+PHP-FPM”(取决于你用的 Web 模式)
如果改完仍不生效,大概率是 php_json.dll 文件缺失。此时可从同版本官方 Windows ZIP 包中提取该文件(比如从 windows.php.net 下载对应 VC 和位数的 ZIP,解压后取其中 ext\php_json.dll),复制到你的 phpEnv 对应 PHP 版本的 ext 目录下。
常见报错与对应排查点
以下错误几乎都指向配置链路断裂,而非代码问题:
-
Call to undefined function json_encode():90% 是php.ini未启用扩展,或extension_dir路径写错(比如多写了反斜杠、用了绝对路径) -
PHP Warning: PHP Startup: Unable to load dynamic library 'php_json.dll':DLL 文件不存在,或架构不匹配(VC15 版 PHP 不能用 VC14 编译的 DLL) -
json_last_error() returns JSON_ERROR_SYNTAX:这不是扩展问题,是传给json_decode()的字符串本身非法(比如含 BOM、非 UTF-8 编码、控制字符)
验证是否生效最直接的方式:在 Web 根目录放一个 test.php,内容为 <?php var_dump(function_exists('json_encode'));。返回 bool(true) 才算真正就位。
phpEnv 下处理中文 JSON 数据的隐性坑
即使 json_encode() 可用,PHP 默认会把中文转成 \uXXXX 形式,前端看着费劲。要输出原生中文,必须加 JSON_UNESCAPED_UNICODE 参数:
<?php
$data = ['name' => '张三', 'city' => '上海'];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 输出:{"name":"张三","city":"上海"},而不是 {"name":"\u5f20\u4e09","city":"\u4e0a\u6d77"}
这个参数在 PHP 5.4+ 支持,但 phpEnv 若用的是 PHP 5.3.x,则无法使用 —— 此时只能升级 PHP 版本,别试图打补丁。另外,确保你的 PHP 文件本身以 UTF-8 无 BOM 格式保存,否则 json_encode() 可能静默失败并返回 false。


















