2019年了,PHP已不再是当年那个“设计糟糕”的语言

作者 | Brent

译者 | 张兰月

这篇文章不在于解决关于 PHP 的那个永恒话题,而是想让你了解,PHP 在这些年的进展以及那些值得关注的特性与发展现状。

之前,有一篇非常流行的博客文章是“PHP:那些糟糕的设计”,第一次读到这篇博客的时候,我正在一个非常破旧的地方工作,处理着许多 PHP 遗留项目。这篇博客对我触动很深,我开始思考是否要停止编程,换一份完全不同的工作。文章地址:

https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

幸运的是,很快我就换了一份工作,而 PHP 在 5.X 版本之后又有了很多新的改进。今天,我要向那些不再使用 PHP 编程,或者陷入遗留项目的人致敬。

剧透:直到今天,PHP 仍有很多糟糕的东西,例如许多核心功能仍然存在不一致的方法签名,仍然存在令人混淆的配置设置,仍然会有一些开发者因为知识的缺乏而导致写的代码很糟糕等等。

但是,本文我想把目光集中在 PHP 已经改进的地方上面,以及如何写出更加干净和易维护的 PHP 代码。也许你不会改变对 PHP 的看法,但很有可能,你会惊讶于过去几年 PHP 的进步。

要 点

  • PHP 每年都会推出一个新的版本;
  • 自 PHP 5 代之后,其性能不断提升;
  • 有框架、包和平台组成的活跃生态系统;
  • 过去几年间,PHP 添加了许多新的特性,且现在仍在持续演进;
  • 许多工具如静态分析器也越发成熟,未来也将继续发展。

更新:很多人希望我能够展示一下实际代码,这是我其中一个业余项目的源代码,它是用 PHP 和 Laravel 写的,另外还有一个是我们在办公室负责维护的上百个 OSS 包的列表。

  • https://github.com/brendt/aggregate.stitcher.io
  • https://spatie.be/open-source/packages

回顾历史

让我们先快速回顾一下 PHP 的版本发布周期。现在 PHP 的版本是 7.3,预计 2019 年末将发布 PHP 7.4,7.4 之后的版本将会是 PHP 8.0。

从 5.X 版本之后,PHP 核心团队一直在努力每年发布一个新版本,并且在过去的 4 年间,这一目标一直完成得很好。

大致来说,每个新版本都会用 2 年时间进行积极地支持,然后用一年进行“安全修补”工作。这样做的目的是促使 PHP 开发者尽可能保持最新状态,例如每年都升级比从 5.4 直接跳到 7.0 要简单得多。

PHP 具体的版本发布情况,可以查看:

https://www.php.net/supported-versions.php

搞清楚 PHP 的发展历程后,我们来谈谈大家对 PHP 的常见误解。

PHP 的性能

在 5.X 版本时代,PHP 的性能平均而言是最好的。而在 7.0 时代,大部分的 PHP 核心都从零开始重写了,其性能能够达到之前的 2-3 倍。口说无凭,幸运的是,有人花了大量时间来测量 PHP 的性能,Kinsta 提供了一个很好的更新列表。

从 7.0 版本以来,PHP 性能就只升不降。PHP web 应用的性能可以和其他语言 web 框架的性能相提并论,甚至更高。具体测试情况可查看:

https://github.com/the-benchmarker/web-frameworks

当然,PHP 框架的性能还无法超越 C 和 Rust,但是要比 Rails 或 Django 好,且能够和 ExpressJS 相媲美。

框架和生态系统

在谈到框架时,PHP 已经不再只是 WordPress 了。作为职业的 PHP 开发者,我认为,WordPress 无法从任何层面代表当今的生态系统。

总体来说,有 2 个主要的 web 应用框架以及一些相对而言较小的框架,如 Symfony 和 Laravel。除此之后,还有 Zend、Yii、Cake、 Code Igniter 等等。

如果你想了解现代 PHP 开发究竟是什么样子,那么就需要掌握 Symfony 和 Laravel 中的一个,这 2 个框架都有庞大的生态系统,包含各种包和产品。从管理面板和客户关系管理系统 (CRM) 到单独的包,从持续集成 (CI) 到性能监视工具,我们有无数的服务如 web 套接字服务器、队列管理器、支付集成等等。

但是,这些框架都是为实际开发而设计的。如果你需要纯粹的内容管理,WordPress 和 CraftCMS 是理想选择,而且它们还会不断优化。

衡量 PHP 生态系统目前状态的方法是看一看 Packagist,它是 PHP 主要的包仓库。在过去的时间里,它呈现出了指数式增长的态势,每天 2500 万左右的下载量,足以说明 PHP 生态系统已经不再是过去那种弱者了。

Packagist 网站上列出了过去的包和版本数量:

除了应用框架和内容管理系统 (CMS) 以外,我们还发现,在过去几年,异步框架也崛起了。

异步框架是指用 PHP 或其它语言编写的框架和服务器,它们能够让用户运行真正异步的 PHP。异步框架的例子包括:Swoole、Amp 和 ReactPHP。

由于我们已经进入异步领域,具有大量 IO 的 web 套接字和应用等东西在 PHP 世界中就变得非常重要。

另外,人们还谈到了内部邮件列表,在邮件列表中,PHP 核心开发者讨论了 PHP 语言的进一步发展,例如增加 libuv 到核心之中。对于不熟悉 libuv 的人来说,libuv 同 Node.js 用于实现其所有异步性的库一模一样。

语言本身

尽管异步 (async) 和等待 (await) 还未面市,但 PHP 在过去几年已经经过了许多改进,下面便是 PHP 新特性的不完全列表:

  • 短闭包
  • https://stitcher.io/blog/short-closures-in-php
  • 空合并运算符
  • https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator
  • Traits
  • https://www.php.net/manual/en/language.oop5.traits.php
  • 属性类型
  • https://stitcher.io/blog/new-in-php-74#typed-properties-rfc
  • 扩散运算符
  • https://wiki.php.net/rfc/argument_unpacking
  • JIT 编译器
  • https://wiki.php.net/rfc/jit
  • FFI
  • https://wiki.php.net/rfc/ffi
  • 匿名类
  • https://www.php.net/manual/en/language.oop5.anonymous.php
  • 声明返回类型
  • https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration
  • 现代密码学
  • https://wiki.php.net/rfc/libsodium
  • Generators
  • https://wiki.php.net/rfc/generators
  • 其他
  • https://www.php.net/ChangeLog-7.php

尽管我们的主题是 PHP 的语言特性,但我还是觉得需要谈一下 PHP 语言的开发流程。虽然社区被允许提出 RFC,但仍有一个活跃的志愿者核心团队在推动 PHP 的发展。在添加一个新的语言特性之前,必须要进行投票。只有获得 2/3 多数选票的 RFC 才能被添加到核心中。

大约有 100 个人可以投票,但你不需要给每个 RFC 投票。核心团队的成员毋庸置疑能够投票,因为他们必须维护代码库。除了他们以外,还有一群人是单独从 PHP 社区中挑选出来的,这些人员包括 PHP 文件的维护人员,PHP 整体项目的贡献者,以及 PHP 社区中颇具威望的开发者。

虽然大多数核心开发是由志愿者组成的,但其中一名核心 PHP 开发者 Nikita Popov 近期被 JetBrains 雇佣,并全职负责该语言的开发。另外一个例子是 Linux 基金会决定投资 Zend 框架。上述这些雇佣和收购行为确保了未来 PHP 开发的稳定性。

工 具

除了核心本身,我们还目睹了过去几年间工具的增长。首先进入我脑海的是静态分析器如 Vimeo 发明的 Psalm,以及 Phan 和 PHPStan。

这些工具能够静态分析 PHP 代码,并且报告打字错误、可能的 bug 等等。在某些方面,它们提供的功能足以和 TypeScript 相媲美,但目前 PHP 还没有被转编译 (transpile),因此它并不支持定制句法。

虽然这意味着我们必须依赖于文档块,但 PHP 的最初发明者 Rasmus Lerdorf 提出了将静态分析引擎添加到核心之中的想法。这个想法潜力巨大,但任务量着实不小。

提到转编译,由于受到 JavaScript 社区的启发,有许多人试图将 PHP 句法延伸到用户空间中。一个名叫 Pre 的项目就做了这件事情:它支持新的已经转编译为普通 PHP 代码的 PHP 句法。

虽然这一想法已经在 JavaScript 中得以实现,但只有在提供了适当的集成开发环境 (IDE) 和静态分析支持后,它才能在 PHP 工作。这一想法非常有趣,但还必须不断完善,才能变成“主流”。

结束语

尽管 PHP 还有很多缺点和遗留问题,但我可以充满信心地说,我喜欢使用它。就我的经验来看,它可以创建可靠、可维护和高质量的软件。如果使用得当,PHP 对于 web 开发来说是个非常棒的选择。

来源:格尔木SEO

原文地址:https://www.cnblogs.com/1994jinnan/p/12239295.html

时间: 2024-11-10 07:27:20

2019年了,PHP已不再是当年那个“设计糟糕”的语言的相关文章

我已不是当年的我——2015年终总结

慢慢的,我发现我已不是当年的我了. 首先,做人: 对自己.觉得现在的自己很开心,不开心的事情也能转化正能量,每天的生活充满了挑战和希望. 对团队.现在特别喜欢跟很多人一起,共同怀揣梦想,尽力去将它实现,比如共同参加软考,比如一起学英语,比如做新生项目.以前总觉得因为喜欢才会去做,现在深刻的体会到因为做了才会深深的喜欢.今年,最大的变化就是开始变得长情,变得专一,更加愿意承担责任,并且为之付出,甘之如饴. 对父母.越来越觉得他们如此的不易.现在学着自己做饭.洗碗,开始觉得很脏,很累,还要早起,好困

[Intern][2019.03.16]针对已有的HTML如何只凭JS改动?

刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦.以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不知道,只有通过改动JavaScript才能实现对页面的修改. 固然,操作DOM有原版的 document.getElementsBy 一族,可是它们get的时候不能通过 class 和 标签 来区分,比如: <div class="FAIL"> <tr class=&qu

支付宝相互宝:你的2019年度助人成绩单已生成,分摊金额29元

据支付宝相互宝的消息,2019 年,全国有 1 亿多人加入了相互宝.2019 年大家一共救助了 15325 位身患重病的成员.2019 全年,相互宝实际分摊金额为 29 元,远低于年初预估的 188 元的最高线. 据介绍,相互宝成员基数大,并且结构年轻,以 80.90 后为主,重疾发生率低于社会平均水平.相互宝表示,管理费比例为8%,也让大家分摊的每一分钱,都尽可能地用于救助. 另外需要注意的是,随着时间推移,大部分成员度过等待期,相互宝 2020 年的重疾发生率也会高于 2019 年,因此实际

iperf3已不再支持双工模式测试

iperf是一个很好的网络流量测试工具,最近想在工具里面集成iperf最新的版本iperf3,希望借助iperf3测试以太网口的吞吐量,客户要求测试双工模式下吞吐量,可是,整了一圈,原来iperf3并不支持双工模式测试,iperf2是指支持的. 官方原文是这么说的: Not planning to support these iperf2 flags. If you really miss these options, please submit a request in the issue t

iPad 此设备已不再链接

解决方案一: 我用的osx10.9.3刚遇到与楼主一样的问题. 只能说osx系统自我保护比较好,可以阻止一切未知源,不过这一样很简单. 第一步:在苹果下拉菜单找到“系统偏好设置”打开 第二步:选择“通用”设置 第三步:选择“任何来源” 哈哈,就这样连上了. 方案2: 在mac设置中,点开安全性与隐私,点开防火墙选项,弹出一个窗口,把iTunes添加进去就好了

AutoCAD 2019 for mac 非常好用的CAD三维设计绘图软件

macOS下用什么cad软件?mac在哪下载cad软件? AutoCAD 2019 for mac 是一款非常好用的CAD三维设计绘图软件,可应用三维建模.CAD.渲染.动画.视觉特效和数字图像. AutoCAD® 是一种计算机辅助设计 (CAD) 软件,建筑师.工程师和建筑专业人员可依靠它来创建精确的 2D 和 3D 图形使用实体.曲面和网格对象绘制和编辑 2D 几何图形及 3D 模型使用文字.标注.引线和表格注释图形使用附加模块应用和 API 进行自定义 下载地址:https://www.m

[已读]响应式web设计

去年冲着响应式这三个字买的,很快就读完了,因为说实话都挺浅显的内容.真正涉及到响应式的是第二和第三章(媒体查询 em 百分比图片),其他的h5与css3关系不大.

在【已转出档案】设计项列(用的实体为a)表界面上有一个转出详情按钮,点击转出详情按钮时调出【档案转出记录】设计项的编辑界面(用的实体为b),筛选条件为DangAnID=ID的代码如下

function(button, e) { debugger; // 中断调试指令,可以手动删除它 var me = this; // this 为列表视图控制器 var viewModel = this.getViewModel(); // 获取视图模型 var grid = this.getView(); // 获取到列表视图 var records = grid.getSelectionModel().getSelection(); // 获取到选中的记录数组 var record=rec

曾经的曾经的多么多么的爱一个人。。。

可那时的我们那里知道什么是爱 被伤害过 被抛弃过 才知道那只是儿戏... 多么的希望陪我去走后半辈子的那个人是你呀... 当初陪我一起吃苦的你呀... 而当年已不再是当年 过去已不再是过去 回想往事是多么的可笑 “你给我的爱不是我想要的” 一句话 一辈子 那道伤疤伤在心上, 心每跳动一次, 它就会被伤害一次 从此不再敢爱 恨.. 恨这个世界 为什么老天对我这么不公平 当恨累了 才发现 你爱错了人 你爱的不是她 而是她的肉体 从此... 从此不再爱 静静的一个人 一个人蛮好的 不再为了感情而纠结