PHP 5.3以下json_encode返回null因UTF-8处理不严,需用mb_detect_encoding检测并mb_convert_encoding转码;PHP 5.2缺失array_column和__invoke,应手动兼容并移除trait、禁用短标签。

PHP版本过低导致json_encode返回null怎么办
PHP 5.3 以下版本对UTF-8编码处理不严格,遇到非UTF-8字符串(如GB2312、含BOM的JSON输入)时,json_encode直接返回null,且不报错,极易引发空指针逻辑错误。
- 先用
mb_detect_encoding检查字符串编码,再用mb_convert_encoding($str, 'UTF-8', 'auto')转码 - 避免依赖
json_last_error()——PHP 5.2 没这个函数,得靠=== null判断并手动记录原始内容 - 若数据来自表单或文件上传,统一在入口层用
iconv('GBK', 'UTF-8//IGNORE', $input)兜底(//IGNORE可跳过非法字节)
PHP 5.2 不支持__invoke和array_column怎么兼容
很多现代框架或组件(如旧版ThinkPHP扩展)会悄悄调用这些特性,PHP 5.2 直接报Fatal error: Call to undefined function array_column()或Method __invoke does not exist。
- 手动补全
array_column:定义函数前加if (!function_exists('array_column')) { ... },内部用foreach模拟 - 替代
__invoke:把对象回调改为显式调用$obj->handle(),或用call_user_func($obj, ...)(PHP 5.2 支持对象作为回调) - 检查Composer autoload是否加载了PHP版本敏感的trait——PHP 5.2 不支持trait,需移除或条件跳过
短标签在低版本PHP开启但高版本默认关闭,如何安全过渡
很多老项目用 echo $a; ?>,一旦服务器升级到PHP 7+且short_open_tag = Off,整页白屏无报错,排查极难。
- 用
grep -r "[^p=]" . --include="*.php"批量扫描非和=的短标签 - 替换时不要盲目全改
——=在PHP 5.4+才默认开启,低版本需确认asp_tags = Off且short_open_tag = On - 更稳妥的是统一用
,并配合php -l逐个文件语法检查
OpenSSL函数缺失或curl_setopt参数不识别导致HTTPS请求失败
PHP 5.2 默认不编译OpenSSL扩展,且CURLOPT_SSL_VERIFYPEER等常量在早期cURL版本中不存在,file_get_contents('https://...')直接返回false。
立即学习“PHP免费学习笔记(深入)”;
- 先用
extension_loaded('openssl')和function_exists('curl_init')做运行时检测,失败则降级用HTTP或抛出明确异常 - 避免硬写
CURLOPT_SSL_VERIFYPEER——改用defined('CURLOPT_SSL_VERIFYPEER') ? CURLOPT_SSL_VERIFYPEER : 64(64是该常量在libcurl中的实际值) - 若必须HTTPS,优先用
stream_context_create配ssl选项,比curl兼容性更好
null、常量未定义、扩展不可用却没提示。所有兼容逻辑必须带运行时探测,不能只靠版本号判断。










