一、为什么面试官总爱问 PHP7 和 PHP8
这两年出去面试 PHP 岗位,几乎每家都会问到版本特性。倒不是面试官故意刁难,而是版本升级直接关系到项目性能优化和代码写法。PHP7 把执行效率拉高了一大截,PHP8 又引入了 JIT 和一堆语法糖,你要是答不上来,很容易被判定为“只会写业务、不关注底层”。这篇文章我把两者核心差异捋一遍,再用人话讲讲 JIT 到底是怎么回事,文末附上可运行的对比代码。
二、PHP7 带来的关键变化
PHP7 最直观的贡献是性能翻倍。Zend Engine 3.0 重写了底层数据结构,内存占用明显下降。对普通开发者来说,最常用到的其实是下面几点:
- 标量类型声明:函数参数和返回值可以声明 int、string、float、bool,配合严格模式能提前拦截不少低级错误。
- 太空船操作符 <=>:比较两个表达式,返回 -1、0 或 1,写排序回调时特别省事。
- 合并运算符 ??:替代 isset 的三元写法,代码干净很多。
- 匿名类:临时实现接口或抽象类时不用再单独建文件。
这些特性让 PHP7 在当时的 Web 后端里显得非常能打,也是很多老项目从 PHP5 升级上来的主要原因。
三、PHP8 又往前迈了一大步
PHP8 在 2020 年底发布,最吸引眼球的是 JIT,但日常开发里更常用的是这些语法改进:
- 命名参数:调用函数时可以跳过中间参数,只传需要的那个,可读性提升明显。
- 构造器属性提升:构造函数里直接声明并赋值属性,样板代码少了一大半。
- match 表达式:比 switch 更严格,不需要 break,返回值也更直观。
- 联合类型:参数或返回值可以接受多种类型,比如 int|string。
- nullsafe 操作符 ?->:链式调用时遇到 null 直接返回 null,不再一路报错。
这些特性让 PHP8 写起来更像一门现代语言,代码量肉眼可见地减少。
四、JIT 原理通俗讲解
JIT 全称 Just-In-Time,意思是“即时编译”。要理解它,得先知道 PHP 代码是怎么跑起来的。传统模式下,PHP 源码先被编译成字节码(opcode),然后由 Zend 虚拟机一条条解释执行。解释执行的优点是启动快、内存省,缺点是循环密集的代码跑得慢。
JIT 的思路很简单:在程序运行过程中,把那些反复执行的热点代码(比如大循环里的计算)直接编译成机器码,CPU 就能原生执行,不再一条条解释。你可以把它理解成“边跑边把常用路线修成高速公路”,而解释执行就像每次都在走普通小路。
不过要泼一盆冷水:JIT 对纯 Web 请求的提升有限,因为每个请求生命周期太短,热点还没热起来就结束了。它真正受益的场景是计算密集型的 CLI 脚本、图像处理、加密解密这类长时间运行的任务。面试时能说出这一点,比单纯背概念要加分不少。
五、可运行的对比代码
下面这段代码演示了 PHP7 和 PHP8 在写法上的差异,你可以直接保存为 test.php 运行:
<?php // PHP7 风格:合并运算符 + 太空船 function compare7(int $a, int $b): int { return $a <=> $b; } // PHP8 风格:构造器属性提升 + 联合类型 class User { public function __construct( public string $name, public int|string $age = 0 ) {} } // PHP8 命名参数:跳过中间参数 function greet(string $name, string $greeting = "Hello"): string { return "$greeting, $name"; } echo compare7(3, 5), PHP_EOL; // -1 echo greet(greeting: "Hi", name: "PHP"), PHP_EOL; // Hi, PHP $user = new User(name: "Alice", age: "unknown"); echo $user->name, PHP_EOL; // Alice ?>运行环境需要 PHP 8.0 以上,命令行执行 php test.php 即可看到输出。代码里同时用到了类型声明、命名参数和属性提升,正好覆盖前面讲到的重点。
六、面试答题小技巧
最后给准备面试的同学几点建议。第一,别只背特性名称,要能说出每个特性解决了什么痛点。第二,JIT 一定要讲清楚适用边界,别吹得神乎其神。第三,最好准备一个自己写过的升级案例,哪怕只是把一段老代码改成 PHP8 写法,也比空谈理论有说服力。版本特性是敲门砖,真正拉开差距的是你对底层原理的理解深度。