如果你可以改变 PHP 的某些东西,而不必担心向后兼容性问题或发生重大变更,你会想改变哪些?我想我肯定会改变它的一两件东西,甚至是十件。
我喜欢思考这些话题,不是因为我认为所有这些东西都必须被添加到 PHP 中,而是因为挑战我们自己的观点并批判性地思考语言设计是件好事。
我会让这个清单尽量保持简短但又重点突出,同时会链接到更有深度的相关内容。让我们一起来看看吧!
泛型
首先是泛型。如果我必须按照优先级递减的顺序来排列我的愿望清单,泛型排在第 1 到第 5 位,其余的在后面。
但很明显,PHP 不会引入泛型,只要我们想在运行时验证它们。而这是我想要的第二件东西。
没有运行时类型检查
这不仅仅是为了泛型,还因为这样可以支持很多很酷的东西,而不影响运行时——切换到一个可选择的静态分析编译器。
实际上,我写了一篇深入分析不需要运行时类型检查的文章(https://stitcher.io/blog/we-dont-need-runtime-type-checks)。静态分析非常强大,如果我们能够摆脱“试图在运行时完成所有事情”的想法,它将极大地促进 PHP 的发展。
这只是我的个人观点,你可以不认同。
一个 PHP 的超集
就像 TypeScript 那样。想象一下,如果我们能够将一种超集语言编译成普通的 PHP,那将会为我们带来怎样的可能性——复杂的静态类型检查、在 PHP 的运行时约束下很难实现的很多很酷的语法、泛型……
这里有很多需要注意的地方。我做了一个关于这个话题的播客(https://www.youtube.com/watch?v=kVww3uk7HMg),我在播客中讨论了超集的一些缺点,但我仍然希望有一天这个梦想可以成为现实。
级联属性
这个可能是可行的——一种简单的从父类获取属性的方法。
所以我们不这样写:
而是这样写:
标量对象
由于已经有可用的用户实现,所以它在我的愿望清单中不是很靠前,不过如果标量对象可以有个正式的叫法就更好了,比如用 String 代替 StringHelper(这是 Laravel 解决 String 是保留关键字的方式)。
管道操作符
以前有一个关于它的 RFC——管道操作符,但已经有一段时间不活跃了。事实上,我认为 Larry Garfield 某一天仍然会想做这件事,但我不确定目前的计划是怎样的。
不管怎样,如果有管道操作符会很酷:
注意,我想到了一些创造性的想法,能够结合使用参数占位符和 $$ 语法。
一致的函数名称
“这将是一个重大的变更!!!”所有的 PHP 函数最终都遵循相同的命名约定,不再使用 str_replace 和 strlen,而是 string_replace 和 string_length。
不过这也并非什么重大的变更,我们可以使用 Rector 等工具进行自动化更名,静态分析器会在我们编写代码时告诉我们正确的函数名。这需要一些时间来适应,但至少会有一致的 API 命名约定。
一切都更严格
如果你现在还没有对我大吼大叫,那么在读完这部分内容之后,可能有很多人会这么做。我希望 PHP 变得更加严格。为什么?因为我喜欢清晰的代码。更严格的语言意味着更少的解释空间或幕后魔法,可以避免许多困惑,包括:
默认是 final 的;
返回类型是必需的;
省略返回类型就是 void;
所有代码都必须显式敲打出来;
可见性修饰符是必需的。
这些可能永远都不会发生,但没关系,我可以通过使用 PHP CS 强制执行其中的大部分规则。
回看
最后,我在过去列了一个类似的清单,实际上我很高兴看到我当时希望的一些东西在今天的 PHP 中实现了:
枚举;
只读的属性;
命名的参数;
可以使用协变返回类型。
所以,谁知道呢,这个清单中的一些东西最终可能会出现在 PHP 中!
原文链接:
https://stitcher.io/blog/php-reimagined-part-2
评论 2 条评论