PHP5、PHP7、PHP8 版本核心区别与特性
PHP5:经典老版本,国内大量老项目(TP3.2、ThinkPHP5早期);
PHP7:划时代性能大升级,工业生产主流;
PHP8:现代PHP,强类型、JIT、大量语法增强,新项目首选。
重要:PHP5已于2016停止维护;PHP7.4 2022结束支持;生产优先PHP8.1/8.2
一、PHP5(5.2 ~ 5.6)
PHP5.6是PHP5系列最终版本。
主要特性
-
- 面向对象完整支持 :类、对象、继承、接口、魔术方法
__get/__set/__construct;
- 面向对象完整支持 :类、对象、继承、接口、魔术方法
-
- 魔术引号 magic_quotes_gpc(5.3默认关闭,5.6彻底移除);
-
- 支持命名空间
namespace(5.3新增);
- 支持命名空间
-
- 后期静态绑定
static::(5.3);
- 后期静态绑定
-
- 可变参数
func_get_args(),goto语法;
- 可变参数
-
::class类名常量(5.5);
-
- 生成器 yield(5.5);
-
- 常量数组
const定义数组(5.6);
- 常量数组
-
- 支持
...可变参数(5.6)。
- 支持
PHP5 痛点
-
- 性能很差,Zend VM老旧,大请求CPU占用高;
-
- 弱类型极其松散,没有严格类型模式;
-
- 很多函数参数类型不校验,传错类型静默报错;
-
- 大量废弃函数:
mysql_*系列函数(5.5标记废弃,7直接删除);
- 大量废弃函数:
-
- 错误机制混乱,很多致命错误不能捕获;
-
- 不支持返回值类型声明;
-
- 内存泄漏场景多,长连接/cli常驻模式内存上涨明显。
项目:ThinkPHP3.2 最佳运行环境 PHP5.6
二、PHP7(7.0 ~7.4,里程碑版本)
最大变化:重写Zend引擎(PHPNG),性能大幅提升,PHP7相比PHP5性能提升2‑3倍,内存占用下降 。
7.0重大革新;7.4是PHP7最终稳定版。
✨PHP7.0 核心新特性
-
- 标量类型声明
// 参数类型声明(默认弱模式)
function sum(int a, int b) {
return a + b;
} -
- 返回值类型声明
function getNum(): int {
return 100;
} -
- 空合并运算符
??
name = _GET['name'] ?? 'default';
// 替代 isset(_GET['name']) ? _GET['name'] : 'default'; - 空合并运算符
-
- 太空船运算符
<=>
echo 1 <=> 2; // -1
echo 2 <=> 2; // 0
echo 3 <=> 2; // 1 - 太空船运算符
-
- Throwable 异常顶层接口 PHP5中,Fatal Error致命错误无法被
try‑catch捕获;PHP7所有错误都实现Throwable,可以捕获。
try {
test();
}catch(Throwable e){ echo e->getMessage();
} - Throwable 异常顶层接口 PHP5中,Fatal Error致命错误无法被
-
- 移除大量废弃内容
- • 删除整个
mysql_*扩展,只能用mysqli / PDO; - • 移除ereg正则系列函数。
-
- 64位整数支持,统一整数溢出行为。
PHP7.1
-
- 可为空类型
?int
function getAge(): ?int{} // 返回int或者null
- 可为空类型
-
- 多异常捕获
catch (AException | BException $e)
- 多异常捕获
-
- 数组解构
list()支持键名
- 数组解构
PHP7.2
-
- 对象类型
object类型声明;
- 对象类型
-
ext‑json改为内置不可关闭;
-
- 废弃部分核心函数。
PHP7.3
-
- Heredoc/Nowdoc语法修复;
-
- JSON抛出异常模式。
PHP7.4(7系列终点)
-
- 箭头函数
fn()
arr = array_map(fn(v)=>$v*2, [1,2,3]);
- 箭头函数
-
- 类型属性(类的成员变量声明类型)
class User{
public int id; public ?string name;
} -
- 弱引用WeakReference;
-
- 预加载opcache preload(cli/fpm常驻预加载类,提升性能)。
PHP7 总结
-
• 性能飞跃;支持参数、返回值类型;
-
• 但是默认还是弱类型模式,传字符串进int参数会自动强制转换;
function foo(int $a){}
foo("123"); // php7 默认可以,自动转成123,不会报错
需要开启严格模式:
declare(strict_types=1);文件开头开启,才会强校验。
三、PHP8(8.0、8.1、8.2、8.3)现代PHP
大幅强化类型系统,JIT即时编译,大量语法糖,错误行为改变,部分7的代码升级8会报错,存在不兼容。
PHP8.0 重大更新
-
- 命名参数,按参数名字传参,不用关心顺序
htmlspecialchars(string:"abc", flags:ENT_QUOTES);
-
- 联合类型 |
function test(int|string $val): int|null {}
-
- Match表达式(加强版switch)
res = match(status){
1 => '待支付',
2 => '已支付',
default => '未知'
};
match是表达式有返回值,严格比较,不需要break。
-
- 构造器属性提升,简化写类
class User {
// 直接在构造函数声明属性,不用外部定义
public function __construct(
public int id, public string name
){}
}
u = new User(1,'zhangsan'); echo u->id; -
- JIT即时编译 (重大性能特性) opcache基础上,把PHP字节码编译成CPU机器码,CPU密集型代码性能提升;IO密集型web业务提升有限。
-
- Null安全运算符
?->
// 不用多层isset判断
name = user?->profile?->name;
// 如果user为null,直接返回null,不报错 - Null安全运算符
-
- 字符串数字比较逻辑彻底改写,修复历史大量坑;
-
- 很多警告变成Fatal Error,代码不严谨直接报错;
-
- 资源转为对象,大量废弃函数。
PHP8.1
-
- 枚举 Enum
enum Status:int {
case PAY_WAIT =1;
case PAY_OK =2;
} -
- 只读属性 readonly;
-
- 纤程 Fiber(协程底层);
-
- 纯交集类型
&。
- 纯交集类型
PHP8.2
-
- 只读类
readonly class;
- 只读类
-
- 常量支持枚举;
-
- 废弃动态属性(不在类声明的属性直接赋值会告警)。
PHP8.3
- • 类型系统继续完善,json_validate,隐式类型弱化。
四、关键差异对比表
| 特性 | PHP5.6 | PHP7.x | PHP8.x |
|---|---|---|---|
| Zend引擎 | 老Zend2 | PHPNG重构引擎 | PHPNG + JIT |
| 性能 | 低 | 提升2‑3倍 | 7基础上再提升,支持JIT |
| 标量类型声明 | 不支持 | 支持(默认弱类型) | 支持,语法增强 |
| 返回值类型 | 无 | 支持 | 支持,联合类型 |
| 类属性类型 | 无 | 7.4支持 | 完善,readonly |
| 空合并?? | 无 | 7.0 | 支持 |
| null安全?-> | 无 | 无 | 8.0+ |
| match表达式 | 无 | 无 | 8.0+ |
| 构造器提升 | 无 | 无 | 8.0+ |
| Enum枚举 | 无 | 无 | 8.1+ |
| 捕获致命错误 | 不能 | Throwable | Throwable |
| mysql_*扩展 | 存在 | 已删除 | 不存在 |
| 严格模式strict_types | 无 | 支持 | 支持 |
五、升级踩坑重点(开发面试高频)
-
- PHP5 → PHP7
- • 删除
mysql_*,全部改成PDO/mysqli; - • 部分函数参数行为变化;
- • 致命错误可以被Throwable捕获; TP3.2可以跑PHP7,但存在小兼容坑,不建议上PHP8。
-
- PHP7 → PHP8 兼容坑
-
- 字符串和数字比较逻辑改变,
"123abc" == 123行为变化;
- 字符串和数字比较逻辑改变,
-
- 很多notice/warning升级Error,旧脏代码直接报错;
-
- 废弃动态属性,8.2给未声明属性赋值告警;
-
- JIT只对CPU密集任务生效,普通web业务开启JIT不一定变快;
-
- 老框架:TP3.2 不能跑PHP8,大量语法报错。
六、生产选型建议
-
- 老项目 TP3.2:最高 PHP5.6;不建议7.4以上,兼容坑多;
-
- ThinkPHP5、Laravel老版本:PHP7.4;
-
- 新项目Laravel10+、现代PHP项目:PHP8.1 / PHP8.2(长期支持版本)。
面试常见追问
-
declare(strict_types=1)作用:文件级别开启严格模式,参数传错误类型直接报错,而不是自动强制转换;只对函数参数生效,不影响变量赋值。
-
- JIT什么时候开启收益大:计算密集业务;普通web接口大部分时间等待DB/redis IO,JIT收益很小。
-
- null安全运算符
?->和??区别。
- null安全运算符