【翻译】现代PHP

2019-08-27

这是一篇翻译文章,介绍了现代PHP开发的诸多,作者Brent,原文名《PHP in 2019》,原文链接:https://stitcher.io/blog/php-in-2019

相信国内很多开发者都还停留在”老式“PHP代码中(我也不例外),从这篇文章中了解了不少新东西,征得作者同意后,试着翻译成中文。由于第一次翻译文章,如果发现表达不清或者有误,请指出:)

以下是原文

还记得那篇流行的文章:"PHP: a fractal of bad design" 么,第一次读到的时候这篇文章,那是我正在一堆PHP老项目上写着蹩脚的代码,我很困惑是否该转行从事别的行业。

幸运的是,之后不久我就换了新的工作,更重要是PHP从5.*的时代开始也发生了很大的改变。今天我为那些不再用PHP编程,或者还困于老式项目(legacy project)的人写点东西。

声明:PHP仍有一些糟糕的东西,就像所有语言都有其缺陷一样。很多内置函数命名仍不一致,有很多令人迷惑的配置项,还有很多的开发者在写蹩脚的代码 -- 也许是必须这么写,也许是不知道更好的写法。

今天我想关注好的一面,关注那些让我们能写出清晰的可维护的PHP代码的改进。我想请你在接下来的几分钟的放下任何偏见。之后你可以拾起偏见,就像以前一样,但你会对过去几年PHP的一些改进感到惊喜!

TL;DR

更新:有人让我展示一下实际代码,没问题。这里是我其中一个业余项目的代码,用PHP和Laravel;而这里是我们公司维护的几百个开源项目,两者都是现代PHP项目的好例子。

让我们开始吧!

历史回顾

为了更好对比,我们快速回顾一下PHP的发布周期。现在最新版是7.3,7.4将会在2019年底发布,7.4之后下一版是8.0。

自从PHP 5的时代,PHP核心开发团队就开始尽量保持每年发布一版的节奏,在过去四年都是如此。一般情况下,每个新版会有会得到两年的活跃维护,两年后会进入为期一年的安全维护。这么做是为了PHP开发者尽可能地用上新版本:每年小版本升级比多年一次大升级(比如从5.4升到7.0)容易得多。

具体的PHP版本周期可以查看这里

稍微提一下,PHP 5.6 是 PHP 5 的最后一版,7.0成为了新的大版本,如果你想知道为什么没有6.0,可以听听这个播客

回顾了历史,我们可以解开一些对现代PHP的常见误解。

性能

回看PHP 5的时代,PHP的性能只能说……表现平平。在7.0版本中,大量核心代码的重写,使性能得到2-3倍的性能提升。

空口无凭,来看看跑分(benchmark)成绩。一些人花了不少时间来测试PHP的性能,这里有一个不错的测试结果。

随着7.0的性能提升,大多数的PHP应用都因此获益,它们已经可以在性能上和其他语言的框架一较高下了,在某些情况下会更好。这里有一份Web框架的跑分表。

虽然基于PHP的框架性能比不上C或者Rust, 但它们比Rails或者Django好得的多,和ExpressJS相当。

框架和生态

说到框架,PHP 不只是有 WordPress,让我以一个专业PHP开发者的身份告诉你:WordPress并不能代表现在的PHP生态环境。

一般来说,现在有两大主要框架 Symfony 和 Laravel , 外加还有一些占有率较小的,比如Zend、Yii,Cake,Code Igniter 等。但如果你想学习现代PHP的开发方式,还是选两者之一好一点。

每个框架都有用很好的生态,无论是后台管理面板、CRM、软件包、CI、性能分析,还是各种服务比如websocket、队列管理、支付集成,老实说应有尽有。

这些框架很适合开发,但如果你只想要纯粹的内容管理软件,像 WordPress 和 CraftCms 这样的平台也在不断进步。

Packagist作为PHP主要的package仓库,它的数据也是另一个衡量PHP生态的指标。它呈现指数级的增长,每天的下载量达到了2500万次,可以说PHP的生态不想以前这么弱小了。

看看下面这张图,列出了包和版本的数量,也可以在Packagist官网上看到。

在应用框架和CMS之外,过去几年异步框架也在兴起。

这些用PHP或者其他语言编写的异步框架和服务,让用户能运行真正的异步PHP程序,比如Swoole,Amp,ReactPHP。

当我们使用异步编程,像socket编程或者大量IO的操作也可以在PHP中来完成。

而且核心开发人员的邮件列表中也在讨论异步编程,通过添加libuv进入内核的方式。如果你不了解libuv,它就是支持Node.js能够异步编程的库。

语言本身

虽然asyncawait还不支持。语言本身已经有了很多改进,这里是一份不完全列表:

当我们谈到语言特性,同时也是在谈论语言的发展。这里有活跃的志愿者核心开发团队在推动这PHP向前发展,并且社区也可以提出RFC。

然后在内核邮件列表中,会讨论所有的RFC。在决定是否要实现前会先进行投票,只有得到至少2/3的票数才能添加到语言中。大概只有一百个人能进行投票,并不是每个RFC都得投。核心团队的成员当然可以投票,他们需要维护代码库。此外,还有一群从社区中挑选出来的人,包括PHP文档维护者,PHP项目的贡献者,社区中优秀的PHP开发者。

大多数核心开发是自愿工作的,其中一位,Nikita Popov 最近受雇于JetBrains全职PHP语言的开发。另外 Linux 基金会最近决定投资Zend framework。像这样雇佣和收购确保了PHP未来的稳定发展。

工具

在语言核心之外,我们也看到大量的工具冒出出来。首当其冲的是静态分享工具,比如Vimeo创建的Psalm ; Phan 和 PHPStan.

这些工具会静态地分析你的PHP代码,报告类型错误,潜在的 bug 等。某种程度上,有点类似于TypeScript,只不过没有被转译(transpiled),所以不允许添加自定义语法。

虽然这意味着我们需要依赖docblocks,但是PHP的创始人 Rasmus Lerdorf 提到了添加静态分析引擎的想法。这个想法非常有潜力,也很艰巨。

说到转译,是受到JavaScript社区的启发。在代码层面(原文:user land)有了很多扩展PHP语法的努力,一个叫做Pre的项目就做这样的事情,把新的PHP语法转译为普通的PHP语法。

这种思路已经在JavaScript的世界中证明了,如果有合适的IDE和静态分析的支持,在PHP中也能这么做。这是个有趣的想法,但想要成为主流还有很长的路要走。

结语

正如开头所说,仍可以把PHP看做一门糟糕的语言。因为语言有它自己的缺陷,还有20年来的积累的历史包袱。但我可以肯定说:我喜欢用PHP。

根据我的经验,我能写出可靠的可维护的高质量软件。我和我服务的客户对此都很满意。

尽管也可以用PHP做很多糟糕的事情,但我想说PHP是web开发最好的选择--如果你用对了正确的方式。

有不同意见?欢迎给我反馈,我的 twitter e-mail


全文完

翻译心得

翻的真烂,相当蹩脚,不信不达不雅,如果你看到了这里,推荐还是去原文看下吧。:)