PHP 5.3 以下版本的 json_encode 不支持 JSON_UNESCAPED_UNICODE 等标志,传入会返回 false 且不报错;5.2 及更早版本无 json_last_error 函数,难以排查错误。

PHP 版本太低导致 json_encode 报错或行为异常
PHP 5.3 以下版本的 json_encode 不支持 JSON_UNESCAPED_UNICODE 等标志,传入会直接返回 false,且不报错,容易误判为数据为空。更老的版本(如 5.2)甚至没有 json_last_error 函数,无法排查失败原因。
- 检查当前 PHP 版本:
php -v或在脚本中用PHP_VERSION_ID判断 - 若需输出中文不转义,且 PHP str_replace + 正则处理原始 JSON 字符串(仅限简单场景)
- 避免依赖
JSON_INVALID_UTF8_IGNORE等 7.2+ 才支持的选项,低版本可先用mb_convert_encoding($data, 'UTF-8', 'UTF-8')预清洗
PHP 5.2/5.3 中 array_column 和 password_hash 缺失怎么办
这两个函数分别在 PHP 5.5 和 5.5.0 引入,低版本直接调用会触发 Fatal error: Call to undefined function。不能靠条件判断绕过,必须提前补全或替换实现。
-
array_column可用foreach手动提取,注意键名保留逻辑(是否用原数组键作新数组键) -
password_hash推荐引入ircmaxell/password-compatComposer 包(兼容 PHP 5.3.7+),它会在运行时自动降级到crypt+ 盐值生成 - 切勿用
md5或sha1自行“模拟”密码哈希——安全性归零
PHP 5.3 以下无法使用命名空间和 __DIR__ 的兼容写法
PHP 5.2.6 开始支持 __DIR__,但部分老旧环境(如某些共享主机)仍禁用或未更新。命名空间在 5.3 才引入,5.2 项目强行升级到新版框架(如 Laravel 5.1+)会直接无法启动。
- 替代
__DIR__:用dirname(__FILE__),两者语义等价且 5.0 就存在 - 无命名空间时,类名需全局唯一,可用下划线分隔模拟层级(如
Database_MySQL_Connector),并配合__autoload(5.1.2+)或spl_autoload_register(5.1.2+)加载 - Composer 自动加载器默认要求命名空间,若必须用 Composer 且 PHP composer install --ignore-platform-reqs 并手动改 autoloader
安全函数被废弃(如 mysql_*)又不能升级 PHP 怎么办
PHP 7.0 彻底移除了 mysql_connect 等函数,但很多老站还跑在 PHP 5.2 上,此时不是“能不能用”,而是“该不该继续用”。即使能运行,也已无安全更新、无漏洞修复。
立即学习“PHP免费学习笔记(深入)”;
- 优先迁移到
mysqli或PDO:二者在 PHP 5.0 就已内置,只需重写数据库操作层,不依赖 PHP 版本升级 - 若代码量大无法立即重构,至少加一层封装函数(如
db_query),内部根据 PHP 版本选择驱动,把mysql_*调用隔离出去 - 注意
mysqli面向对象写法在 5.0+ 可用,但过程式写法(mysqli_connect)更接近旧习惯,迁移成本更低
intl 或 mbstring 扩展,而旧服务器根本没启用。上线前务必用 php -m 核对扩展列表,别只盯着 PHP 主版本。











