PHP7和PHP8对比
🧠 一、性能提升
| 对比项 | PHP 7 | PHP 8 | 说明 |
|---|---|---|---|
| 执行速度 | 比 PHP 5 提升约 2 倍 | 再提升 10~20% 左右 | PHP 8 引入 JIT (Just-In-Time) 编译器 |
| 内存占用 | 显著降低(相对 PHP 5) | 与 PHP 7 相近 | 内存优化趋于稳定 |
| JIT 编译 | ❌ 无 | ✅ 有 | 将字节码编译为机器码,加快 CPU 密集型计算 |
🧩 二、类型系统与语法改进
| 特性 | PHP 7 | PHP 8 | 示例 | |
|---|---|---|---|---|
| 标量类型声明 | ✅ 支持 | ✅ 支持 | function add(int $a, int $b): int | |
| 返回类型声明 | ✅ 支持 | ✅ 支持 | function sum(): int | |
| 可空类型(?Type) | ✅ 支持 | ✅ 支持 | ?string $name | |
| 联合类型(Union Types) | ❌ 无 | ✅ 有 | `function foo(int | string $x)` |
| 静态类型检查改进 | 基本 | 更严格 | 错误提示更精确 | |
| match 表达式 | ❌ 无 | ✅ 有 | 取代 switch,返回值表达式 | |
| 命名参数 | ❌ 无 | ✅ 有 | foo(y: 2, x: 1) | |
| Constructor Property Promotion(构造属性提升) | ❌ 无 | ✅ 有 | public function __construct(private int $id) | |
| nullsafe 操作符 | ❌ 无 | ✅ 有 | $user?->profile?->address | |
| Attributes(注解) | ❌ 无 | ✅ 有 | #[ORM\Column(type: "string")] |
🧮 三、错误与异常处理改进
| 对比项 | PHP 7 | PHP 8 | 说明 |
|---|---|---|---|
| 错误类型 | Error 类引入,替代传统错误 | 继续使用并强化 | 所有错误类型统一为 Throwable |
| TypeError / ValueError | ✅ 有 TypeError | ✅ 新增 ValueError | 比如:strlen([]) 抛出 ValueError |
| 内部函数异常化 | ❌ 大多只产生警告 | ✅ 抛出异常 | 提高一致性 |
🧰 四、面向对象增强
| 特性 | PHP 7 | PHP 8 | 示例 |
|---|---|---|---|
| 抽象语法树(AST) | ✅ 引入 | ✅ 继续改进 | 内部结构更清晰 |
| 新字符串函数 | ❌ 无 | ✅ str_contains, str_starts_with, str_ends_with | |
| WeakMap | ❌ 无 | ✅ 有 | 弱引用容器,便于 GC 管理 |
| static 返回类型 | ✅ 支持 | ✅ 支持 | 延续 PHP 7.4 改进 |
| Trait 方法冲突解决 | ✅ 有 | ✅ 有 | 无变化 |
| 封装属性提升(property promotion) | ❌ 无 | ✅ 有 | 简化构造函数写法 |
⚙️ 五、语法糖与便捷性特性
| 特性 | PHP 7 | PHP 8 | 示例 |
|---|---|---|---|
| 三元运算符简写 | ✅ ?: | ✅ 同 | $a = $b ?: 'default'; |
| 空合并运算符 | ✅ ?? | ✅ 同 | $a = $b ?? 'default'; |
| 空合并赋值运算符 | ❌ 无 | ✅ 有 | $a ??= 'default'; |
| 命名参数 | ❌ 无 | ✅ 有 | foo(x: 1, y: 2) |
| match 表达式 | ❌ 无 | ✅ 有 | match($x) {1 => 'a', 2 => 'b'} |
🔒 六、安全性与一致性
| 对比项 | PHP 7 | PHP 8 | 说明 |
|---|---|---|---|
| 一致的类型错误 | 不完全 | 更严格 | 函数参数类型不符直接抛异常 |
| Hash 与加密函数 | ✅ 强化 | ✅ 继续增强 | 提升密码哈希接口一致性 |
| 资源类型重构 | ✅ 保留 | ✅ 部分改为对象 | 如 GD、Curl 现在是对象类型 |
🧰 七、废弃与不兼容变更(Breaking Changes)
| 内容 | PHP 7 | PHP 8 |
|---|---|---|
each() 函数 | 可用 | ❌ 移除 |
create_function() | 可用 | ❌ 移除 |
implode() 参数顺序 | 容忍反顺序 | ❌ 不再容忍 |
| 内部函数参数 | 宽松检查 | ✅ 严格类型化 |
| 数组与字符串比较 | 允许 | ❌ 不再允许 |
@ 错误抑制性能 | 无影响 | ⚠️ 性能显著下降 |
| 自动类型转换 | 宽松 | 更严格 |
🧠 八、JIT 编译机制简介
- JIT 全称: Just-In-Time Compilation
- 作用: 在运行时将 Zend VM 字节码编译为机器码,提升 CPU 密集型任务性能(如数学计算、图像处理)。
- Web 场景提升有限,主要对算法类任务或长期运行进程(如 Daemon、CLI 工具)效果明显。
✅ 九、总结对比表
| 项目 | PHP 7 | PHP 8 |
|---|---|---|
| 性能 | 快 | 更快(JIT) |
| 语法特性 | 基本完善 | 引入大量语法糖 |
| 类型系统 | 静态+可空 | 加强联合类型 |
| 错误机制 | 基本统一 | 全面异常化 |
| 开发体验 | 成熟 | 现代化、简洁 |
| 向下兼容 | 高 | 部分不兼容 |
PHP8为什么更快了
PHP 8 相比 PHP 7 速度更快,主要不是因为语言层面改了语法,而是因为 底层引擎(Zend Engine)和执行机制的核心优化。
我们来系统拆解一下为什么 PHP 8 会更快:
🚀 一、JIT(Just-In-Time)编译器引入——最大功臣
🧩 原理:
PHP 7 之前,所有代码执行流程是:
PHP 源码 → 词法/语法分析 → OPCODE(字节码) → Zend VM 解释执行PHP 8 增加了:
PHP 源码 → OPCODE → JIT 编译 → 机器码(直接在 CPU 执行)💡 好处:
- CPU 密集型任务(数学运算、图像处理、AI算法):性能可提升 2~5 倍。
- Web 请求型任务:提升有限(约 5~15%),因为大部分瓶颈在 I/O(网络、数据库、文件)。
🔍 举例:
假设一段简单的循环计算:
php
$sum = 0;
for ($i = 0; $i < 10000000; $i++) {
$sum += $i;
}- PHP 7:解释执行,每次循环由虚拟机执行 opcode。
- PHP 8:JIT 直接生成机器码,一次编译后原生执行。 → 执行时间可能从 0.8 秒下降到 0.1 秒。
⚙️ 二、Zend 引擎优化(Zend Engine 4)
PHP 8 使用 Zend Engine 4,在 PHP 7 的 Zend Engine 3 基础上进行了多项性能微调。
🔧 主要优化:
Opcode 缓存更智能
- Opcache 内部结构重写。
- 减少重复编译、哈希查找次数。
函数调用栈优化
- 调用开销降低(尤其是内部函数调用)。
改进的内存管理器
- 引用计数机制和垃圾回收算法更高效。
- 减少
zval复制,使用共享引用。
改进的 HashTable 实现
- PHP 的数组底层是哈希表。
- PHP 8 进一步优化了哈希冲突处理、rehash 次数和内存布局。
🧠 三、类型系统优化(Type System)
- PHP 8 更严格的类型推断让 Zend 引擎 在运行前就能优化路径。
- 例如,知道
$a是 int 时,JIT 可以生成固定整数运算的机器码。 - 减少了运行时类型检查成本。
⚡ 四、函数内联与字节码优化
🔹 PHP 7
- 所有函数调用都需要栈帧切换、zval 包装、参数解析。
🔹 PHP 8
- 引入了 内联调用优化(Inlining)。 某些常用函数(如
strlen,count)在编译时就被替换为底层 C 操作。 - 同时,Opcode 执行路径被重新组织,避免频繁跳转。
🧰 五、改进的 Opcache(字节码缓存)
PHP 8 Opcache 模块更高效:
- 内存映射(mmap)方式更优化。
- 字节码缓存粒度更细,减少重新验证(revalidation)次数。
- 支持 JIT 缓存。
结果: → 首次请求后性能提升明显,后续请求几乎是“即时响应”。
🔒 六、函数与对象模型优化
内部函数使用真实类型签名(C-level)
- 避免运行时类型转换。
对象属性布局优化
- PHP 8 改变对象属性存储结构,查找速度更快,内存更紧凑。
WeakMap / COW 优化
- 减少引用计数触发的复制开销。
📈 七、综合性能提升情况(实测数据)
| 测试项目 | PHP 7.4 | PHP 8.0 | 提升幅度 |
|---|---|---|---|
| WordPress | 262 req/s | 297 req/s | +13% |
| Laravel | 237 req/s | 265 req/s | +12% |
| Symfony | 247 req/s | 277 req/s | +12% |
| 算术计算 | 100% | 300%~500% | +3~5倍(JIT) |
(来自 PHP 官方与 Phoronix 实测)
✅ 总结一句话:
PHP 8 更快的根本原因是底层执行机制的现代化:
🧠 JIT 编译 + 更聪明的 Zend 引擎 + 改进的内存与类型系统 ⏩ 让 PHP 从解释语言逐步具备了“准编译语言”的性能特征。
