PHP新手应默认按7.4+编写但主动兼容5.6+,避开废弃语法与扩展;须查官方迁移文档、用phpinfo()核对版本,并验证Deprecated Features与Removed Extensions;常见陷阱包括print_r第二参数(5.4+)、JSON_UNESCAPED_UNICODE(5.4+)、mbstring扩展未启用等。

PHP 新手写代码,最怕的不是语法不会,而是写的代码在别人服务器上跑不起来——版本不兼容、函数被禁用、短标签报错、时区乱套。核心原则就一条:默认按 PHP 7.4+ 写,但主动降级兼容 PHP 5.6 起步项目时,必须手动避开已废弃语法和扩展。
怎么判断自己写的 PHP 代码是否兼容旧版本
别猜,直接查官方迁移文档 + 本地开多版本验证。PHP 官网的 phpinfo() 输出里看 PHP Version,再对照 Deprecated Features 和 Removed Extensions 列表。常见踩坑点:
-
print_r($arr, true)在 PHP 5.4+ 才支持第二个参数返回字符串,5.3 会静默失败 -
json_encode($data, JSON_UNESCAPED_UNICODE)的常量JSON_UNESCAPED_UNICODE是 PHP 5.4 引入的,老环境要用iconv()或正则替换 -
mb_strlen($str, 'UTF-8')依赖mbstring扩展,很多共享主机默认不启用,得先extension_loaded('mbstring')判断
新手最容易写错的“兼容性陷阱”写法
这些看着很自然的写法,在低版本或严格配置下直接报错:
- 用
=短标签?确认short_open_tag = On(PHP 7.4+ 默认 Off,且已被标记为废弃)→ 改用 - 写
$arr = [1,2,3];数组字面量?PHP 5.3+ 支持,但若目标环境是 5.2(极少见但仍有),得写$arr = array(1,2,3); - 用
$_SERVER['REQUEST_URI']做路由?某些 CGI 模式下该值为空 → 改用parse_url($_SERVER['PHP_SELF'], PHP_URL_PATH)更稳 - 直接
new DateTime()?没设时区会触发警告 → 必须显式传参:new DateTime('now', new DateTimeZone('Asia/Shanghai'))或提前date_default_timezone_set('Asia/Shanghai')
基础脚本开头必须加的三行兼容防护
每个新 PHP 文件开头建议固定加这三行,能挡住 80% 的运行时兼容问题:
立即学习“PHP免费学习笔记(深入)”;
if (version_compare(PHP_VERSION, '5.6.0', '<')) {
die('PHP 5.6+ required.');
}
error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE);
date_default_timezone_set('Asia/Shanghai');
说明:
-
version_compare()比字符串比较可靠,避免'7.0' > '5.10'这类错误 -
E_DEPRECATED关掉弃用警告,否则 PHP 7.2+ 里mysql_*函数即使没调用也会报错(如果加载了扩展) - 时区不设,
date()、strtotime()等函数在部分系统上返回 false,且无提示
真正麻烦的不是语法差异,而是扩展可用性、ini 配置项开关、以及 CGI/FPM/Apache 模块模式带来的环境变量差异。写完一段逻辑,最好在 Docker 里拉个 php:5.6-apache 和 php:8.2-cli 各跑一遍 —— 兼容不是靠记忆,是靠验证。










