点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

我希望 PHP 里可以改变的一些东西

  • 2023-01-20
    北京
  • 本文字数:1842 字

    阅读完需:约 6 分钟

我希望PHP里可以改变的一些东西

如果你可以改变 PHP 的某些东西,而不必担心向后兼容性问题或发生重大变更,你会想改变哪些?我想我肯定会改变它的一两件东西,甚至是十件。


我喜欢思考这些话题,不是因为我认为所有这些东西都必须被添加到 PHP 中,而是因为挑战我们自己的观点并批判性地思考语言设计是件好事。


我会让这个清单尽量保持简短但又重点突出,同时会链接到更有深度的相关内容。让我们一起来看看吧!


泛型

首先是泛型。如果我必须按照优先级递减的顺序来排列我的愿望清单,泛型排在第 1 到第 5 位,其余的在后面。

function app(classString$className): ClassType{     // …}
复制代码

但很明显,PHP 不会引入泛型,只要我们想在运行时验证它们。而这是我想要的第二件东西。


没有运行时类型检查

这不仅仅是为了泛型,还因为这样可以支持很多很酷的东西,而不影响运行时——切换到一个可选择的静态分析编译器。


实际上,我写了一篇深入分析不需要运行时类型检查的文章(https://stitcher.io/blog/we-dont-need-runtime-type-checks)。静态分析非常强大,如果我们能够摆脱“试图在运行时完成所有事情”的想法,它将极大地促进 PHP 的发展。


这只是我的个人观点,你可以不认同。


一个 PHP 的超集

就像 TypeScript 那样。想象一下,如果我们能够将一种超集语言编译成普通的 PHP,那将会为我们带来怎样的可能性——复杂的静态类型检查、在 PHP 的运行时约束下很难实现的很多很酷的语法、泛型……


这里有很多需要注意的地方。我做了一个关于这个话题的播客(https://www.youtube.com/watch?v=kVww3uk7HMg),我在播客中讨论了超集的一些缺点,但我仍然希望有一天这个梦想可以成为现实。


级联属性

这个可能是可行的——一种简单的从父类获取属性的方法。


所以我们不这样写:

$attributes = [];
do { $attributes = $reflection->getAttributes( name: RouteAttribute::class, flags: ReflectionAttribute::IS_INSTANCEOF );
$reflection = $reflection->getParentClass();} while ($attributes === [] && $reflection);
复制代码


而是这样写:

$attributes = $reflection->getAttributes(    name: RouteAttribute::class,    flags: ReflectionAttribute::IS_INSTANCEOF          | ReflectionAttribute::CASCADE);
复制代码


标量对象

由于已经有可用的用户实现,所以它在我的愿望清单中不是很靠前,不过如果标量对象可以有个正式的叫法就更好了,比如用 String 代替 StringHelper(这是 Laravel 解决 String 是保留关键字的方式)。

$string = new String(' hello, world ')->trim()->explode(',');
复制代码

管道操作符

以前有一个关于它的 RFC——管道操作符,但已经有一段时间不活跃了。事实上,我认为 Larry Garfield 某一天仍然会想做这件事,但我不确定目前的计划是怎样的。


不管怎样,如果有管道操作符会很酷:

$result = "Hello World"    |> htmlentities(...)    |> str_split(...)    |> array_map(strtoupper(...), $$)    |> array_filter($$, fn($v) => $v != 'O');
复制代码


注意,我想到了一些创造性的想法,能够结合使用参数占位符和 $$ 语法。


一致的函数名称

“这将是一个重大的变更!!!”所有的 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

相关阅读:

PHP 8.0重大版本更新正式发布:支持JIT编译器,性能提升高达3倍

PHP 中类自动加载相关文件分析

初识 PHP(1):PHP 是什么

PHP 中命令行调用 escapeshellarg 函数中文问题

2023-01-20 09:189436

评论 2 条评论

发布
用户头像
我觉得最应该改改的就是那个->有点费键盘
2023-02-06 20:13 · 山东
回复
用户头像
嗯哼
2023-01-29 08:50 · 浙江
回复
没有更多了
发现更多内容
我希望PHP里可以改变的一些东西_编程语言_Brent_InfoQ精选文章