mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-16 22:42:21 +08:00
170 lines
11 KiB
Markdown
170 lines
11 KiB
Markdown
|
[#]: collector: (lujun9972)
|
|||
|
[#]: translator: (wxy)
|
|||
|
[#]: reviewer: ( )
|
|||
|
[#]: publisher: ( )
|
|||
|
[#]: url: ( )
|
|||
|
[#]: subject: (PHP in 2019)
|
|||
|
[#]: via: (https://stitcher.io/blog/php-in-2019)
|
|||
|
[#]: author: (Brent https://stitcher.io/blog/php-in-2019)
|
|||
|
|
|||
|
9102 年的 PHP
|
|||
|
======
|
|||
|
|
|||
|
你还记得篇流行的《[PHP:糟糕设计的分形][3]》博客文章吗?我第一次读它时,我在一个有很多遗留的 PHP 项目的糟糕地方工作。这篇文章让我去思考我是否应该放弃并去做与编程完全不同的事情。
|
|||
|
|
|||
|
幸运的是,我之后很快就换了工作,更重要的是,自从 5.x 版本以来,PHP 成功地进步了很多。今天,我在向那些不再使用 PHP 编程,或者陷入遗留项目的人们致敬。
|
|||
|
|
|||
|
剧透:今天有些事情仍然很糟糕,就像几乎每种编程语言都有它的怪癖一样。许多核心功能仍然有不一致的调用方法,仍然有令人困惑的配置设置,仍有许多开发人员在那里写蹩脚的代码 —— 因为他们必须如此,或因为他们不知道更好的写法。
|
|||
|
|
|||
|
今天我想看看好的一面:让我们关注已经发生变化的事情以及编写干净而可维护的 PHP 代码的方法。在此之前,我想请你暂时搁置任何偏见。
|
|||
|
|
|||
|
之后,你可以像以前一样自由地对 PHP 发表你的看法。虽然你可能会对 PHP 在过去的几年里的一些改进感到惊讶。
|
|||
|
|
|||
|
### 提前看结论
|
|||
|
|
|||
|
* PHP 在积极开发,每年都有新版本
|
|||
|
* 自 PHP 5 时代以来的性能翻倍,如果不是三倍的话
|
|||
|
* 有一个非常活跃的框架、包和平台的生态系统
|
|||
|
* PHP 在过去几年中添加了许多新功能,并且这种语言在不断发展
|
|||
|
* 像静态分析这样的工具在过去几年中已经成熟,并且一直保持增长
|
|||
|
|
|||
|
更新:人们让我展示一些实际的代码。我觉得这没问题!这是我的一个爱好项目的[源代码][4],用 PHP 和 Laravel 编写;[这里][5]列出了我们在办公室维护的几百个自由开源软件包。这两者都是现代 PHP 项目的好例子。
|
|||
|
|
|||
|
开始吧。
|
|||
|
|
|||
|
### 历史总结
|
|||
|
|
|||
|
出于更好地衡量的目的,让我们快速回顾一下如今的 PHP 发布周期。我们现在的 PHP 为 7.3,预计在 2019 年底为 7.4。PHP 8.0 将是 7.4 之后的下一个版本。
|
|||
|
|
|||
|
自从 5.x 时代以来,核心团队试图保持每年的发布周期,并且在过去的四年中成功地做到了。
|
|||
|
|
|||
|
一般来说,每个新版本都会在两年内得到积极支持,并再获得一年以上的“安全修复”。其目标是激励 PHP 开发人员尽可能保持最新:例如,每年进行小规模升级比在 5.4 到 7.0 之间跳转更容易。
|
|||
|
|
|||
|
可以在 [这里][6] 找到 PHP 时间轴的活动概述。
|
|||
|
|
|||
|
最后,PHP 5.6 是最新的 5.x 版本,而 7.0 是 6.x 的下一个版本。 如果你想知道 PHP 6 发生了什么,你可以听 [PHP Roundtable 播客][7]。
|
|||
|
|
|||
|
了解了这个,让我们揭穿一些关于现代 PHP 的常见误解。
|
|||
|
|
|||
|
### PHP的性能
|
|||
|
|
|||
|
早在 5.x 时代,PHP 的表现就是……嗯,平均水平。但是在 7.0 版本中,PHP 的核心部分从头开始重写,导致性能提升了两到三倍!
|
|||
|
|
|||
|
但光是嘴说是不够的。我们来看看基准测试。幸运的是,人们花了很多时间来对 PHP 性能进行基准测试。 我发现 [Kinsta][8] 有一个很好的更新列表。
|
|||
|
|
|||
|
自 7.0 升级以来,性能就只有提升而没有回退。PHP Web 应用程序的性能就可与其他语言中的 Web 框架相提并论,甚至在某些情况下更好。你可以看看这个[广泛的基准测试套件][9]。
|
|||
|
|
|||
|
当然 PHP 框架不会胜过 C 和 Rust,但它们比 Rails 或 Django 要好得多,并且与 ExpressJS 相当。
|
|||
|
|
|||
|
### 框架和生态系统
|
|||
|
|
|||
|
说到框架:PHP 可不仅仅是 WordPress。让我告诉你,某些专业的 PHP 开发人员:WordPress 绝不代表当代的 PHP 生态系统。
|
|||
|
|
|||
|
一般来说,有两个主要的 Web 应用程序框架,[Symfony][10] 和 [Laravel][11],以及一些较小的应用程序框架。当然还有 Zend、Yii、Cake、Code Igniter 等等,但是如果你想知道现代 PHP 开发是怎么样的,这两者之一都是很好的对象。
|
|||
|
|
|||
|
这两个框架都有一个庞大的包和产品的生态系统。从管理面板和 CRM 到独立软件包,从 CI 到分析器,以及几个 Web 套接字服务器、队列管理器、支付集成等众多服务。老实说,要列出的内容太多了。
|
|||
|
|
|||
|
这些框架虽然适用于实际开发。如果你只是需要个内容管理系统(CMS),WordPress 和 CraftCMS 等平台会越来越好。
|
|||
|
|
|||
|
衡量 PHP 生态系统当前状态的一种方法是查看 Packagist,这是 PHP 的主要软件包存储库。它已呈指数级增长。每天下载量达到 2500 万次,这可以说 PHP 生态系统已不再是以前的小型弱势群体。
|
|||
|
|
|||
|
请查看此图表,它列出一段时间内的软件包和版本数量。它也可以在 [Packagist 网站][12]上找到。
|
|||
|
|
|||
|
![][13]
|
|||
|
|
|||
|
除了应用程序框架和 CMS 之外,我们还看到过去几年里异步框架的兴起。
|
|||
|
|
|||
|
这些是用 PHP 或其他语言编写的框架和服务器,允许用户运行真正的异步 PHP。这些例子包括 [Swoole][14](创始人韩天峰),以及 [Amp][15] 和 [ReactPHP][16]。
|
|||
|
|
|||
|
我们已经进入了异步世界冒险,像 Web 套接字和具有大量 IO 的应用程序之类的东西在 PHP 世界中已经变得非常重要。
|
|||
|
|
|||
|
在内部邮件列表里(核心开发人员讨论语言开发的地方)已经谈到了[将 libuv 添加到核心][17]。如果你还不知道 libuv:Node.js 全赖它提供了异步性。
|
|||
|
|
|||
|
### 语言本身
|
|||
|
|
|||
|
虽然尚未提供 `async` 和 `await`,但在过去几年中,PHP 语言本身已经有了很多改进。这是 PHP 中新功能的非详尽列表:
|
|||
|
|
|||
|
|
|||
|
+ [短闭包](https://stitcher.io/blog/short-closures-in-php)(箭头函数)
|
|||
|
+ [Null 合并操作符](https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator)(`??`)
|
|||
|
+ [Trait](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)
|
|||
|
+ [生成器](https://wiki.php.net/rfc/generators)
|
|||
|
+ [等等](https://www.php.net/ChangeLog-7.php)
|
|||
|
|
|||
|
当我们讨论语言功能时,我们还要谈谈当今语言的发展过程。虽然社区可以提出 RFC,但是得有一个活跃的志愿者核心团队才能推着语言前进。
|
|||
|
|
|||
|
接下来,这些 RFC 将在“内部”邮件列表中进行讨论,这个邮件列表也可以[在线阅读][18]。在添加新语言功能之前,必须进行投票。只有得到了至少 2/3 多数的 RFC 才能进入核心。
|
|||
|
|
|||
|
可能有大约 100 人能投票,但不需要对每个 RFC 进行投票。核心团队的成员当然可以投票,他们是维护代码库的人。除了他们之外,还有一群人从 PHP 社区中被单独挑选出来。这些人包括 PHP 文档的维护者,对 PHP 项目整体有贡献的人,以及 PHP 社区中的杰出开发人员。
|
|||
|
|
|||
|
虽然大多数核心开发都是在自愿的基础上完成的,但其中一位核心 PHP 开发人员 Nikita Popov 最近受雇于 [JetBrains][19] 全职从事于该语言。另一个例子是 Linux 基金会最近决定[投资 Zend 框架][20]。像这样的雇佣和收购确保了 PHP 未来发展的稳定性。
|
|||
|
|
|||
|
### 工具
|
|||
|
|
|||
|
除了核心本身,我们看到过去几年中围绕它的工具有所增加。浮现于我脑海中的是静态分析器,如由 Vimeo 创建 [Psalm][21],以及 [Phan][22] 和 [PHPStan][23]。
|
|||
|
|
|||
|
这些工具将静态分析你的 PHP 代码并报告任何的类型错误和可能的错误等。在某种程度上,它们提供的功能可以与 TypeScript 进行比较,但是现在这种语言不能<ruby>转译<rt>transpiling</rt></ruby>,因此不支持使用自定义语法。
|
|||
|
|
|||
|
尽管这意味着我们需要依赖 docblocks,但是 PHP 的原创建者 Rasmus Lerdorf 确实提到了[添加静态分析引擎][24]到核心的想法。虽然会有很多潜力,但这是一项艰巨的任务。
|
|||
|
|
|||
|
说到转译,以及受到 JavaScript 社区的启发;他们已经努力在用户领域中扩展 PHP 语法。一个名为 [Pre][25] 的项目正是如此:允许新的 PHP 语法转译为普通的 PHP 代码。
|
|||
|
|
|||
|
虽然这个思路已经在 JavaScript 世界中被证明了,但如果提供了适当的 IDE 和静态分析支持,它就能在 PHP 中工作了。这是一个非常有趣的想法,但必须发展起来才能称之为“主流”。
|
|||
|
|
|||
|
### 结语
|
|||
|
|
|||
|
尽管如此,你仍然可以将 PHP 视为一种糟糕的语言。虽然这种语言肯定有它的缺点和与之而来的 20 年的遗产;但我可以放胆地说,我喜欢和它一起工作。
|
|||
|
|
|||
|
根据我的经验,我能够创建可靠、可维护和高质量的软件。我工作的客户对最终结果感到满意,就像我一样。
|
|||
|
|
|||
|
尽管仍然可以用 PHP 做很多乱七八糟的事情,但我认为如果明智和正确地使用的话,它是 Web 开发的绝佳选择。
|
|||
|
|
|||
|
你不同意吗?让我知道为什么!你可以通过 [Twitter][2] 或 [电子邮件][26] 与我联系。
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
via: https://stitcher.io/blog/php-in-2019
|
|||
|
|
|||
|
作者:[Brent][a]
|
|||
|
选题:[lujun9972][b]
|
|||
|
译者:[wxy](https://github.com/wxy)
|
|||
|
校对:[校对者ID](https://github.com/校对者ID)
|
|||
|
|
|||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|||
|
|
|||
|
[a]: https://stitcher.io/blog/php-in-2019
|
|||
|
[b]: https://github.com/lujun9972
|
|||
|
[1]: https://stitcher.io/
|
|||
|
[2]: https://twitter.com/brendt_gd
|
|||
|
[3]: https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/
|
|||
|
[4]: https://github.com/brendt/aggregate.stitcher.io
|
|||
|
[5]: https://spatie.be/open-source/packages
|
|||
|
[6]: https://www.php.net/supported-versions.php
|
|||
|
[7]: https://www.phproundtable.com/episode/what-happened-to-php-6
|
|||
|
[8]: https://kinsta.com/blog/php-benchmarks/
|
|||
|
[9]: https://github.com/the-benchmarker/web-frameworks
|
|||
|
[10]: https://symfony.com/
|
|||
|
[11]: https://laravel.com/
|
|||
|
[12]: https://packagist.org/statistics
|
|||
|
[13]: https://stitcher.io/resources/img/blog/php-in-2019/packagist.png
|
|||
|
[14]: https://www.swoole.co.uk/
|
|||
|
[15]: https://amphp.org/
|
|||
|
[16]: https://reactphp.org/
|
|||
|
[17]: https://externals.io/message/102415#102415
|
|||
|
[18]: https://externals.io/
|
|||
|
[19]: https://blog.jetbrains.com/phpstorm/2019/01/nikita-popov-joins-phpstorm-team/
|
|||
|
[20]: https://getlaminas.org/
|
|||
|
[21]: https://github.com/vimeo/psalm
|
|||
|
[22]: https://github.com/phan/phan
|
|||
|
[23]: https://github.com/phpstan/phpstan
|
|||
|
[24]: https://externals.io/message/101477#101592
|
|||
|
[25]: https://preprocess.io/
|
|||
|
[26]: mailto:brendt@stitcher.io
|