今天早上打开GitHub,看到PHP 8.5.10正式发布的消息。作为一个用了十几年PHP的老程序员,心里还是有点感慨的。

说实话,现在很多年轻人都不怎么写PHP了。面试的时候问会不会PHP,对方往往一脸尴尬,说这个语言不是已经过时了吗。我每次都笑笑,不解释。有些东西,用过的人才懂。

8.5系列带来了什么

PHP 8.5是今年上半年发布的大版本,8.5.10是这个系列的第十个补丁版本。从版本号就能看出来,这个版本已经相当稳定了。我从8.5.0开始用,到现在也有大半年了,基本上没遇到过什么大问题。

8.5最让我喜欢的改进是属性钩子(Property Hooks)。以前写一个类的属性,要写getter和setter,啰嗦得很。现在可以直接在属性声明里定义get和set逻辑,代码清爽了不少。比如:

class User {
    public string $email {
        set {
            if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                throw new InvalidArgumentException("邮箱格式不正确");
            }
            $this->email = strtolower($value);
        }
    }
}

这种写法跟C#有点像,但又保留了PHP的简洁。我在新项目里已经全面用上了,老项目还在慢慢迁移。

另外一个实用的改进是异步函数的原生支持。虽然PHP的异步生态跟Node.js比还差得远,但至少有了原生的async/await语法,写一些并发请求的时候方便多了。以前要搞个curl_multi或者用Swoole,现在简单多了。

升级过程中的坑

我们线上的项目从8.1升到8.5的时候,还是踩了几个坑。最典型的是隐式可空类型的废弃。以前函数参数写了默认值null但没声明?type,8.4开始就deprecated了,8.5直接报错。我们代码库里有几十处这种写法,改了一下午。

还有就是一些老扩展的兼容性问题。比如我们用的一个旧的缓存扩展,在8.5下编译不过。最后没办法,只能换成Redis扩展。这种事情说大不大,但每次升级都要折腾一遍。

所以我的建议是,升级之前一定要在测试环境跑一遍完整的测试用例。我们现在有CI流水线,每次升级PHP版本都会自动跑测试,省了不少事。

性能提升明显吗

说实话,从8.1到8.5,性能提升是有的,但没有那种数量级的飞跃。我们的接口平均响应时间大概快了10%左右,主要是OPcache的改进和一些核心函数的优化。对于大部分业务来说,这个提升感知不强,但聊胜于无。

真正让我觉得爽的是开发体验的提升。除了属性钩子,8.5还改进了错误提示。以前报错信息经常看不懂,现在清晰多了,定位问题快了不少。

还有JIT的改进。虽然PHP的JIT一直被吐槽,但8.5的JIT在CPU密集型任务上确实有提升。我们有一个图片处理的脚本,开了JIT之后快了将近30%。

PHP还有未来吗

这个问题被问了无数次了。我的答案一直是:有,但不是以前那种统治级的未来。

现在新项目用PHP的确实少了,Go、Python、Node.js各占一块。但PHP在Web开发这块,尤其是中小型项目,依然有它的优势。部署简单,生态成熟,开发效率高。WordPress、Laravel、ThinkPHP这些生态还在,短期内不会死。

而且PHP一直在进步。从7到8,语言特性越来越现代化,性能也在稳步提升。只要社区还活跃,这个语言就不会消亡。

我自己的态度是:不排斥新技术,但也不盲目追新。PHP能解决的问题,就用PHP解决。需要用其他语言的时候,也愿意去学。工具而已,没必要有宗教信仰。

8.5.10发布了,我准备周末把线上环境升一下。又要折腾一个晚上了,但程序员的快乐,有时候就这么简单。