写点什么

我希望 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:186452

评论

发布
暂无评论
发现更多内容

大数据知识专栏 -MapReduce 自定义排序技术

小马哥

大数据 hadoop mapreduce 七日更

HTML(四)——建立超链接

程序员的时光

html 程序员 28天写作

蔡超:这八点架构师感悟,真的很干货 | 大道至简

李忠良

28天写作

​Kubernetes资源清单篇:如何创建资源?​

xcbeyond

Kubernetes 28天写作 Kubernetes从入门到精通

永续合约APP系统软件开发

系统开发

观看辽篮比赛,思考团队管理——关于团队的灵魂拷问,你中了几个?

伯薇

团队管理 团队建设 团队 赋能 激励

从烟酒茶说系统化学习

张老蔫

28天写作

跨界融合,区块链推动实体经济提档升级

CECBC

人工智能 云计算 大数据

【我给面试官画饼】软件测试理论基础、质量保证常见面试题——会被面试官赶出来吗?

程序员阿沐

面试 软件测试 测试工程师 质量保证

京东架构师分享的 Redis学习笔记手抄版;

Java架构师迁哥

Android面试(二)

我就感觉到快

技术分享 | 漫谈音视频中的拥塞控制

拍乐云Pano

Soul网关源码阅读(八)路由匹配初探

Java 源码阅读 网关

【盘点2020】机房网络性能哪家强?年度冠军揭晓

博睿数据

机房 评测

休息一天

IT蜗壳-Tango

七日更

看懂2020年智能浪潮,我们从百度和谷歌的AI足迹出发

脑极体

Spring Boot 中使用拦截器

武哥聊编程

Java springboot SpringBoot 2 拦截器 28天写作

程序员生产环境-软件篇

ITCamel

程序员 效率工具 工作效率

数据倾斜?Spark 3.0 AQE专治各种不服

王知无

大数据 spark

基础不牢,地动山摇;自学进大厂的第18天!

Java架构师迁哥

LeetCode题解:105. 从前序与中序遍历序列构造二叉树,递归+哈希表,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

关于JDK15的简单理解

Java架构师迁哥

直播预告丨NLP领域的2020年大事记及2021展望

京东科技开发者

机器学习 AI nlp

HDFS中的常用压缩算法及区别

王知无

大数据 hdfs

实现数字经济和实体经济深度融合

CECBC

区块链

客户服务高触达,零代码从短信/邮件跳转小程序客服

环信

数字货币应用从C端走向B端 实践中这些难题仍需关注

CECBC

数字货币

企业短信服务质量与用户体验如何监控?短信监测技术震撼来袭

博睿数据

短信 数据监测

基于Prometheus+Grafana打造企业级Flink监控系统

王知无

大数据 flink 监控

1000公里续航动力电池背后的迷雾与真相

脑极体

我希望PHP里可以改变的一些东西_编程语言_Brent_InfoQ精选文章