在人生的这个阶段,我不再指望 PHP 在 8.0 版本期间会有重大变化,而是开始展望 PHP 9 的愿望清单。
对于 PHP 的下一个主要版本,目前没有“官方路线图”,但预计 PHP 基金会将开始为一个新版本铺平道路,该版本将打破一些惯例。
谈到惯例,PHP 9 似乎是一个很好的契机,可以引入一些破坏性的改动,以使该语言现代化,无论应用程序运行在哪个平台上,都能让开发变得轻而易举。
1. Return $this
不再返回 static,通过使用 $this,解释器能够知晓我们是返回同一个实例,还是创建了一个新对象。这意味着当调用方法时,解释器可以自行进行优化。这并不是要贬低 static 或 self,而是要确保开发者清楚他正在处理的是同一个对象实例还是不同的对象实例。
2. Loops as expressions
到 2025 年,人工智能将能为孩子们完成作业和撰写论文,但我们仍需使用一个“for”循环,并将结果存储到先前声明的变量中。由于“while”关键字在很久以前就被弃用了,PHP 9 看起来是将其重新引入以创建循环表达式的一个绝佳机会。这样就能避免创建一个返回生成器的函数,然后再将其转换为数组,这是我创建内联数组的首选替代方案。
3. Resources as real classes
从理论上讲,PHP 中的资源是对别处某物的描述符,并未(完全)加载到内存中。PHP 8.0 已逐渐不再将资源视为标量,而 PHP 9 应该是一个绝佳的机会,将它们完全移入类中。通过引入类,现在开发人员可以通过一个假设的 Resource 接口创建自己的资源,比如存储在 10000 公里之外的云服务器上的文件,甚至是来自物联网设备的大量数据库结果列表。鉴于预计到 2026 年及 2027 年内存(RAM)会短缺,这在降低内存使用方面可能会成为救命稻草。
4. Comparable
我一直觉得,与 JavaScript 不同,PHP 没有提供比较对象的方法。而 Comparible 接口正好可以实现这一点,这样就无需再进行类型转换、使用奇怪的函数或编写冗长的代码来使某些东西“可比较”。这将修复所有非标量对象,这些对象具有自己的序列化表示形式,并且不会破坏使用运算符进行的比较。
5. Return Tuples
有时在 PHP 中,您被迫返回包含两个成员的数组。虽然这有时是可以接受的,但存在风险,因为您仍需手动检查每个成员的类型。PHP 9 可以通过启用返回元组来解决此问题。例如,您可以将操作的结果与细节(如跟踪、日志甚至基准测试)分别返回。请注意,这并非要取代异常,而是一种避免返回包含两个元素的数组,甚至避免仅仅为了返回具有严格类型控制的内容而创建另一个类的方法。
6. Deferred return
这种模式源自 Go 语言,允许提前设置要返回的值。当你想要返回一个对象、对其进行修改然后再返回时,这非常有用。当然,这有点小众,但它可能有助于开发人员避免在收到意外但总体安全的值时使用 try-catch 块并返回其他值。
7. Better flag management
标志不应再难以查找、编写和阅读。相反,PHP 9 应包含一个 flag 标量类型,使核心语言和开发人员能够为其函数创建描述性标志。与其使用位运算符之类的手段,标志位将能够对 Zend 引擎中每 8 字节数据内的 64 位中的每一位进行流畅操作。在极端情况下,我们可以将这些标志位转换为十六进制或整数以保持向后兼容性。
8. Automatic Class Loading and Namespace
Composer 和 PSR-4 加载约定已成为现代项目的基石。在 PHP 9 中,这些约定应当成为强制性的。
这意味着 PHP 将会根据这些类和文件所在的目录自动加载它们,而不是向 Composer 请求一个“自动加载器”文件,手动设置,或者使用 或 自动加载这些文件。当然,这些辅助工具仍应继续存在,因为始终有一些几乎无人维护的老库并不严格遵循 PSR-4,但这应当是一个警示信号,要么进行现代化改造,要么就会被遗忘。
9. Embrace the Package Managers
我并非反对 Composer,它为 PHP 生态系统所做的一切都很棒,但现在是时候让它正式成为 PHP 的包管理器了,就像 Go 和 Rust 那样。当然,这意味着要将 Composer 所做的工作转移到核心中的 C(或 Rust)代码中。想象一下,在 PHP 应用程序内部实现无缝安装和管理包,而不是调用 bash 命令,从而避免权限提升的风险。PHP 9 应该允许开发者使用自己的包管理器,PHP 会调用它,而不是让用户直接调用二进制文件。这与 Node.JS 使用 Corepack 的方式非常相似。通过启用多个包管理器,开发人员可以创建不同的配置,特别是为了实现更快的部署和调试。
10. Goodbye semicolon
从 PHP 中移除分号并非一时兴起之举,而是出于对现代编程的考量,因为现代项目中很少见到滥用分号来分隔语句或表达式的情况,这显得非常奇怪且常常难以理解。无论如何,分号应该是可选的。让 PHP 理解换行即为行尾,这样我们就能促使开发者更多地将代码分开,而不是因为他们忘记添加分号而给他们报错。
11. Bonus: Goodbye opening PHP tag
如果你打开一个以 .php 结尾的文件,里面不是 PHP 代码的概率有多大?在这些年里,它更像是一个遗留特性,自 PHP 诞生以来一直困扰着所有的 PHP 版本。如果文件是 PHP 文件,那么<?php ...?> 语法应是可选的。如果解释器发现了它,那么它应预期在文件的某个地方会有结束标签,就像在输出 HTML、JavaScript 或其他语言的 PHP 模板中那样。