PHP每年都会推出一个新的版本;
自PHP 5代之后,其性能不断提升;
有框架、包和平台组成的活跃生态系统;
过去几年间,PHP添加了许多新的特性,且现在仍在持续演进;
许多工具如静态分析器也越发成熟,未来也将继续发展。
更新:很多人希望我能够展示一下实际代码,这是我其中一个业余项目的源代码,它是用PHP和Laravel写的,另外还有一个是我们在办公室负责维护的上百个OSS包的列表。
https://github.com/brendt/aggregate.stitcher.io
https://spatie.be/opensource/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/supportedversions.php
搞清楚PHP的发展历程后,我们来谈谈大家对PHP的常见误解。
PHP的性能
在5.X版本时代,PHP的性能平均而言是最好的。而在7.0时代,大部分的PHP核心都从零开始重写了,其性能能够达到之前的23倍。口说无凭,幸运的是,有人花了大量时间来测量PHP的性能,Kinsta提供了一个很好的更新列表。
从7.0版本以来,PHP性能就只升不降。PHP web应用的性能可以和其他语言web框架的性能相提并论,甚至更高。具体测试情况可查看:
https://github.com/thebenchmarker/webframeworks
当然,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网站上列出了过去的包和版本数量:
2019年了,PHP已不再是当年那个“设计糟糕”的语言
除了应用框架和内容管理系统(CMS)以外,我们还发现,在过去几年,异步框架也崛起了。
异步框架是指用PHP或其它语言编写的框架和服务器,它们能够让用户运行真正异步的PHP。异步框架的例子包括:Swoole、Amp和ReactPHP。
由于我们已经进入异步领域,具有大量IO的web套接字和应用等东西在PHP世界中就变得非常重要。
另外,人们还谈到了内部邮件列表,在邮件列表中,PHP核心开发者讨论了PHP语言的进一步发展,例如增加libuv到核心之中。对于不熟悉libuv的人来说,libuv同Node.js用于实现其所有异步性的库一模一样。
语言本身
尽管异步(async)和等待(await)还未面市,但PHP在过去几年已经经过了许多改进,下面便是PHP新特性的不完全列表:
短闭包
https://stitcher.io/blog/shortclosuresinphp
空合并运算符
https://stitcher.io/blog/shorthandcomparisonsinphp#nullcoalescingoperator
Traits
https://www.php.net/manual/en/language.oop5.traits.php
属性类型
https://stitcher.io/blog/newinphp74#typedpropertiesrfc
扩散运算符
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.returningvalues.php#functions.returningvalues.typedeclaration
现代密码学
https://wiki.php.net/rfc/libsodium
Generators
https://wiki.php.net/rfc/generators
其他
https://www.php.net/ChangeLog7.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开发来说是个非常棒的选择。