PHP5、PHP7、PHP8 版本核心区别与特性

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系列最终版本。

主要特性

    1. 面向对象完整支持 :类、对象、继承、接口、魔术方法 __get/__set/__construct
    1. 魔术引号 magic_quotes_gpc(5.3默认关闭,5.6彻底移除);
    1. 支持命名空间 namespace5.3新增);
    1. 后期静态绑定 static::(5.3);
    1. 可变参数 func_get_args()goto语法;
    1. ::class 类名常量(5.5);
    1. 生成器 yield(5.5);
    1. 常量数组 const 定义数组(5.6);
    1. 支持 ... 可变参数(5.6)。

PHP5 痛点

    1. 性能很差,Zend VM老旧,大请求CPU占用高;
    1. 弱类型极其松散,没有严格类型模式
    1. 很多函数参数类型不校验,传错类型静默报错;
    1. 大量废弃函数:mysql_* 系列函数(5.5标记废弃,7直接删除);
    1. 错误机制混乱,很多致命错误不能捕获;
    1. 不支持返回值类型声明;
    1. 内存泄漏场景多,长连接/cli常驻模式内存上涨明显。

项目:ThinkPHP3.2 最佳运行环境 PHP5.6


二、PHP7(7.0 ~7.4,里程碑版本)

最大变化:重写Zend引擎(PHPNG),性能大幅提升,PHP7相比PHP5性能提升2‑3倍,内存占用下降

7.0重大革新;7.4是PHP7最终稳定版。

✨PHP7.0 核心新特性

    1. 标量类型声明

    // 参数类型声明(默认弱模式)
    function sum(int a, int b) {
    return a + b;
    }

    1. 返回值类型声明

    function getNum(): int {
    return 100;
    }

    1. 空合并运算符 ??

    name = _GET['name'] ?? 'default';
    // 替代 isset(_GET['name']) ? _GET['name'] : 'default';

    1. 太空船运算符 <=>

    echo 1 <=> 2; // -1
    echo 2 <=> 2; // 0
    echo 3 <=> 2; // 1

    1. Throwable 异常顶层接口 PHP5中,Fatal Error致命错误无法被try‑catch捕获;PHP7所有错误都实现Throwable,可以捕获。

    try {
    test();
    }catch(Throwable e){ echo e->getMessage();
    }

    1. 移除大量废弃内容
  • • 删除整个 mysql_* 扩展,只能用mysqli / PDO;
  • • 移除ereg正则系列函数。
    1. 64位整数支持,统一整数溢出行为。

PHP7.1

    1. 可为空类型 ?int

    function getAge(): ?int{} // 返回int或者null

    1. 多异常捕获 catch (AException | BException $e)
    1. 数组解构 list() 支持键名

PHP7.2

    1. 对象类型 object 类型声明;
    1. ext‑json 改为内置不可关闭;
    1. 废弃部分核心函数。

PHP7.3

    1. Heredoc/Nowdoc语法修复;
    1. JSON抛出异常模式。

PHP7.4(7系列终点)

    1. 箭头函数 fn()

    arr = array_map(fn(v)=>$v*2, [1,2,3]);

    1. 类型属性(类的成员变量声明类型)

    class User{
    public int id; public ?string name;
    }

    1. 弱引用WeakReference;
    1. 预加载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 重大更新

    1. 命名参数,按参数名字传参,不用关心顺序

    htmlspecialchars(string:"abc", flags:ENT_QUOTES);

    1. 联合类型 |

    function test(int|string $val): int|null {}

    1. Match表达式(加强版switch)

    res = match(status){
    1 => '待支付',
    2 => '已支付',
    default => '未知'
    };

match是表达式有返回值,严格比较,不需要break。

    1. 构造器属性提升,简化写类

    class User {
    // 直接在构造函数声明属性,不用外部定义
    public function __construct(
    public int id, public string name
    ){}
    }
    u = new User(1,'zhangsan'); echo u->id;

    1. JIT即时编译 (重大性能特性) opcache基础上,把PHP字节码编译成CPU机器码,CPU密集型代码性能提升;IO密集型web业务提升有限。
    1. Null安全运算符 ?->

    // 不用多层isset判断
    name = user?->profile?->name;
    // 如果user为null,直接返回null,不报错

    1. 字符串数字比较逻辑彻底改写,修复历史大量坑;
    1. 很多警告变成Fatal Error,代码不严谨直接报错;
    1. 资源转为对象,大量废弃函数。

PHP8.1

    1. 枚举 Enum

    enum Status:int {
    case PAY_WAIT =1;
    case PAY_OK =2;
    }

    1. 只读属性 readonly;
    1. 纤程 Fiber(协程底层);
    1. 纯交集类型 &

PHP8.2

    1. 只读类 readonly class
    1. 常量支持枚举;
    1. 废弃动态属性(不在类声明的属性直接赋值会告警)。

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 支持 支持

五、升级踩坑重点(开发面试高频)

    1. PHP5 → PHP7
  • • 删除mysql_*,全部改成PDO/mysqli;
  • • 部分函数参数行为变化;
  • • 致命错误可以被Throwable捕获; TP3.2可以跑PHP7,但存在小兼容坑,不建议上PHP8。
    1. PHP7 → PHP8 兼容坑
    1. 字符串和数字比较逻辑改变,"123abc" == 123行为变化;
    1. 很多notice/warning升级Error,旧脏代码直接报错;
    1. 废弃动态属性,8.2给未声明属性赋值告警;
    1. JIT只对CPU密集任务生效,普通web业务开启JIT不一定变快;
    1. 老框架:TP3.2 不能跑PHP8,大量语法报错。

六、生产选型建议

    1. 老项目 TP3.2:最高 PHP5.6;不建议7.4以上,兼容坑多;
    1. ThinkPHP5、Laravel老版本:PHP7.4;
    1. 新项目Laravel10+、现代PHP项目:PHP8.1 / PHP8.2(长期支持版本)。

面试常见追问

    1. declare(strict_types=1)作用:文件级别开启严格模式,参数传错误类型直接报错,而不是自动强制转换;只对函数参数生效,不影响变量赋值
    1. JIT什么时候开启收益大:计算密集业务;普通web接口大部分时间等待DB/redis IO,JIT收益很小。
    1. null安全运算符?->??区别。
相关推荐
MindUp1 小时前
大模型在命理排盘场景下的多平台功能对比与工程化思考
大数据·人工智能
AI直播技术杂谈1 小时前
直播画面突然模糊了,排查了三个小时
开发语言·php
两万五千个小时1 小时前
DeepSeek Harness 从 0 开始:08 Compaction 模块(上下文压缩)
人工智能·程序员·架构
BOBY_KEJI1 小时前
技术实践:AI 数字人一体机在政务与线下商业场景的落地研究
人工智能
阿里云大数据AI技术1 小时前
阿里云 Milvus AI Function | 低成本和高稳定的双重加强
人工智能·agent
小刘快学习1 小时前
印刷包装企业的工艺问答与报价,为什么从直连模型改成了聚合网关
大数据·人工智能
菜冻鱼1 小时前
Python-pytorch-数据加载
开发语言·人工智能·pytorch·python·深度学习·机器学习
heimeiyingwang1 小时前
【架构实战】可观测性三支柱实战:Metrics、Logging、Tracing 如何统一落地
开发语言·架构·php
40岁资深老架构师尼恩1 小时前
RAGFlow 三大引擎 详解:DeepDoc、RAPTOR、GraphRAG
人工智能