PHP的框架和组件的数量很多,多的让人难以置信。有Symfony和Laravel这样的大型框架,也有Silex和Slim这样的微型框架,还有在现代的PHP组件出现之前开发过的过时框架,例如CodeIgniter。现代的PHP生态系统是一个名副其实的大熔炉,有各种各样的代码帮助我们开发者构建强大的应用。
但是,旧的PHP框架是单独开发的,不能与其他PHP框架共享代码。如果你的某个项目使用的是一个旧的PHP框架,那么你就限制在这个框架的生态系统中了。如果你喜欢这种框架提供的工具,以它为中心做开发没有什么问题。但是如果使用CI框架想使用Symfony框架中的辅助库,那应该怎么办呢?你或许只能为项目专门编写一个一次性的适配器。
我们完全无法沟通。 ——电影《铁床喋血》
单独开发的框架没有考虑到和其他框架的通信。这么做效率非常低,对开发者(选择的框架限制了创造力)还是框架本身(重新编写了其他地方存在的代码)都是如此。不过,PHP社区已经从中心化的框架模型进化为分布式生态系统了。分布式生态系统中的组件效率高、互操作性好,而且作用专一。
打破旧局面的PHP-FIG
多位PHP框架开发者意识到了这个问题并在2009年的phpltek上讨论了这个问题。他们讨论了如何改进框架内的通信,如何提高效率。例如,如果PHP框架不重新编写高度耦合的日志类,如何共用 monolog
这种解耦的日志类?如果PHP框架不各自编写HTTP类,如何使用已有的HTTP组件来处理HTTP请求和响应?为了实现这种设想,PHP框架必须使用一种通用方式,让框架之间能通信,能让代码共享。
几位在phpltek意外碰头的PHP框架开发者后来组建了PHP Framework Interop Group(简称PHP-FIG,https://www.php-fig.org)。PHP-FIG是由一些PHP框架代表组成,按照PHP-FIG的说法,这些人聚在一起“讨论项目之间的共性,寻找可以合作的方式。”,PHP-FIG制定了推荐规范。PHP框架可以自愿实现这些规范,改进与其他框架的通信和共享功能。
:::info PHP-FIG发布的是推荐规范,而不是强制规定。推荐规范是谨慎制定的建议,可以让身为PHP开发者的我们生活的更轻松 :::
框架的互操作性
PHP-FIG的使命是实现框架的互操作性,框架的互操作性是指通过接口、自动加载机制和标准的风格,让框架互相合作。
接口
框架通过PHP接口假定第三方以来提供了什么方法,而不用关心依赖内部是如何实现接口的。
例如,第三方日志纪录器对象实现了emergency()、alert()、critical()、error()、warning()、notice()、info()和debug方法,那么框架就可以放心使用这个记录器对象,这些方法如何实现并不用关心,只关心是否实现了这些方法。
PHP开发者使用接口可以开发、共享并使用专门的组件,而无需使用庞大的框架。
自动加载
自动加载是值,PHP解释器在运行时按需自动找到并加载到PHP类的过程。
在PHP标准出现之前,PHP组件和框架会使用魔术方法__autoload()或spl_autoload_register()方法,实现各自特有的自动加载器。因此我们需要学习使用每个组件和框架各自特有的自动加载器。有了标准之后,多数现代的PHP组件和框架都符合同一个自动化加载器标准。这意味着我们只需要使用一个自动化加载器就能混合搭配多个组件。
风格
PHP框架之间需要通过一个标准的代码风格来相互合作,代码风格就是指如何使用空格、大小写和括号的位置等等。如果所有的PHP框架都使用标准的代码风格,那么每次我们使用新的框架时,开发者对框架所使用的代码风格已经熟悉,就不用学习新的代码风格了。标准的代码风格还可以降低项目新贡献者的门槛,让新贡献者把更多的时间用在解决缺陷上,而不用花费太多时间用来熟悉代码风格。
标准的代码代码风格对我们自己的项目也有好处,每个开发者都有一些独特的风格,如果多位开发者在同一个项目中工作,就会显露问题。使用标准的代码风格,不管是谁写的代码,团队中的所有成员都立即理解代码基。
PSR是什么?
PSR是PHP Standards Recommendation(PHP推荐标准)的简称,你或许见过PSR-1、PSR-2、PSR-3等术语。这些都是PHP-FIG指定的推荐规范。PHP-FIG制定的每个推荐规范用于解决大多数PHP框架经常会遇到的某个具体问题。PHP框架无需频繁解决相同的问题,他们只需要遵守PHP-FIG推荐的规范,使用公共的方案来解决。
截至目前,PHP-FIG发布了18个推荐规范(书中只有前五个):
- PSR-0:自动加载规范(已废弃)
- PSR-1:基础编码规范
- PSR-2:编码风格规范
- PSR-3:日志接口规范
- PSR-4:自动加载规范
- ……
更多规范参考:https://learnku.com/docs/psr
:::info 这些规范是现代PHP生态系统的牢固基石,定义了PHP组件和框架实现互操作性的方式。 :::