现代的PHP较少使用庞大的框架,而是更多的使用具有互操作性的专门组件解决方案。在开发新的PHP应用时,可以不直接使用Laravel或Symfony,而是思考能把那些现有的PHP组件组合在一起解决我的问题。
为什么要使用组件?
很多PHP程序员来说,组件是一个陌生的概念。在没有深入理解组件之前,本能会驱使使用巨型框架(Symfony或者CodeIgniter)开发PHP应用,不会考虑其他途径。以前需要花时间研究某个框架的封闭生态,使用框架提供的工具。如果框架没有提供所需的功能,只能自己开发。大型框架很难集成自定义的库或第三方库,因为这些库之间没有使用相同的接口。
如今,在开发应用时,我们可以从不断增加的大量专用组件中选择适合的。既然有了guzzle/http组件,为什么还要浪费时间自己写HTTP请求和响应库呢?既然aura/route和orno/route组件很好用,我们为什么还要重新创建路由类?其他开发者用了无数的时间创建、优化、测试专门的组件,以便让组件尽量做好一件事情,如果想快速开发更好的应用,不使用这些组件而自己重新发明轮子的话,那就太傻了。
组件是什么?
组件是打包的代码,用于解决PHP应用中的某个具体问题,例如你的PHP应用要收发HTTP请求,可以使用现成的组件实现;如果你的应用要解析逗号分隔的数据,也可以使用现成的组件实现,我们使用组件为的是不重新实现已实现的功能,把更多时间用在实现项目的长远目标上。
:::info 严格的说,PHP组件是一系列相关的类、接口和性状,用于实现某个具体问题,组件中的类、接口和性状通常放在同一个命名空间中。 :::
PHP组件有好有坏,如何区分它们也有一些技巧:
作用单一
PHP组件的单一,能很好的解决一个问题。组件不是万能钥匙,不能杂而不精,要术有专攻。组件专注于解决一个问题,而且使用简单的接口封装功能.
小型
PHP组件玲珑小巧,只包含解决某个问题的最少代码。组件中的代码量各异。一个PHP组件可以只有一个PHP类,也可以有多个PHP类,分别放在不同的自命名空间中。PHP组件中类的数量没有限制,根据解决问题的需要,想使用多少个就是用多少个。
合作
PHP组件之间能良好合作。毕竟组件就是为了和其他组件合作,从而解决更复杂的问题。PHP组件不会让自己的代码搅乱全局命名空间,而会把代码放在自己的命名空间中,防止与其它组件命名冲突。
测试良好
因为体型小巧,所以很容易测试。如果PHP组件体型小,而且作用单一,很可能也易于测试。因为组件关注的东西少,而且依赖易于识别和模拟。最好的PHP组件本身会提供测试,而且有充足的测试覆盖度。
文档完善
组件应该能让开发者轻易安装、理解和使用。好的文档可以做到这一点。PHP组件应该有一个README文件,说明组件作用,如何安装以及如何使用。还可以为组件搭建网站,放上更详细的信息。PHP组件的源码应该也有文档,为组件中的类、方法和属性添加中文档块,说明参数、返回值和有可能抛出的异常。
组件和框架对比
框架(尤其是早期的框架)环境都比较封闭,如果我们使用的某个功能这个框架没有,我们就需要寻找并集成自定义的PHP库。把第三方代码集成到框架中是件难事,因为第三方代码和框架没有使用相同的接口。
选择一个框架时,我们看中的是这个框架的未来。我们相信框架的核心开发团队会持续投入时间开发框架,确保框架的代码能跟的上现代标准。可是经常事与愿违,框架很大需要投入大量的时间和精力维护,项目维护的人有自己的生活,工作和兴趣,而生活、工作和兴趣经常会变。
框架并非一无是处
虽然前面说了很多框架的缺点,可框架并非一无是处。Symfony是一个极好的现代PHP框架。这个框架由很多解耦的小型组件构成,这些组件可以放在一起组成框架,也可以在应用中单独使用。
其他较旧的大型框架也在经历类似的变迁,积极地向现代PHP组件靠拢。内容管理框架Drupal就是个例子。Drupal 7 使用过程式PHP代码编写,且代码都在全局命名空间中,Drupal舍弃了现代的PHP实践,是为了支持陈旧的代码基,可视 Drupal 8积极面向现代的PHP靠拢了,跨越的幅度之大值得赞赏,Drupal 8使用了很多PHP组件构建了一个现代化的内容管理平台。
Laravel也是一个流行的PHP框架,由泰勒·奥特威尔编写。与Symfony类似,Laravel构建在自身的Illuminate框架库之上。可是,(截至目前)Laravel的组件不能轻易解耦,用于Laravel之外的应用中.Laravel没有使用PSR-2社区标准,不过从6.0开始,Laravel已经支持语义化版本方案(书中不支持)
:::info 建议:最流行的PHP框架有:
- Aura
- Laravel
- Symfony
- Yii
- Zend :::
使用正确的工具做正确的事
我们应该使用组件还是框架呢?答案是,用正确的的工具做正确的事。大多数现代的PHP框架 其实只是构建在小型PHP足尖上的一系列约定。
如果可以通过一些PHP组件来决绝问题的小型项目,那就是用组件。组件非常易于查找,无需过多关注样板文件,有更多的时间处理手上的大型任务。组件还有助于让代码保持轻量级和灵活性。我们只使用自己所需要的代码,而且特别容易把一个组件换成另一个更合适项目的组件。
如果是有多个成员开发的大型项目,而且能从框架提供的约定、准则、和结构中受益,那就使用框架。可是框架会为我们做很多决定,而且要求我们遵守特殊的约定。框架的灵活性较低,不过较之使用一系列PHP组件。框架为我们提供了很多开箱即用的工具,如果不在意这些,框架是不二之选。使用框架可以引导并加速项目的开发速度。
查找组件
我们可以在PHP组件目录Packagist中查找现代PHP组件,这个网站收集了Composer所有的公开组件,是主要的Composer仓库。
搜索
需要什么插件直接访问Packagist 搜索就行,比如需要收发HTTP消息“http”,或者解析“csv”文件,直接搜索并选择某个组件,把Packagist看成一个卖PHP组件的杂货铺。
选择
**
如果Packagist有多个符合要求的PHP组件怎么办呢?如何选择最好的那个?
Packagist会记录每个组件的统计信息,告诉你每个组件被下载了多少次,以及多少人喜欢。下载和喜欢的人数多了,可能说明这个组件是不错的选择,话虽如此,但别低估下载数量较少的新包。每天都会有很多新包添加在Packagist中。
如果搜索某个关键词时返回大量的结果,可能河南找到最合适的PHP组件。我们不能总是靠下载数来做决定,因为时用的人多并不能表明符合自己的需求,随着Packagist的流行,建议通过口碑和同伴的推荐来选择PHP组件。
回馈
**
如果你喜欢某个PHP组件,在Packagist中为这个组件添加星号,推荐给更多人使用。
使用PHP组件
Packagist是查找PHP组件的地方,Composer是PHP组件的依赖管理器,运行在命令行中。你告诉Composer需要那些PHP组件,Composer会自动下载组件以及组件依赖并自动加载到你的项目中,就这么简单。
Composer的作用很重要,因为依赖管理和自动加载都是很难处理的问题。自动加载是指不使用require()、require_once()、include()或include_once()函数的情况下,按需自动加载PHP类。在较旧的PHP版本中可以使用__autoload() 函数编写自动加载器;在实例化未加载的类时,PHP解析器会自动调用这个函数。后来PHP在SPL库中引入了spl_autoload_register()函数。如何自动加载PHP类库由开发者决定,可是由于缺少通用的自动加载器标准,各个开发者都是用独特的自动加载器,就很难使用其他开发者创建并分享的代码。
PHP Framework Interop Group意识到这个问题,因此制定了PSR-0标准(后被PSR-4取代)。PSR-0和PSR-4建议如何使用命名空间和文件系统的目录结构组织代码,让代码符合标准的自动加载器实现方式。我们没必要自行实现PSR-4自动加载器,因为依赖管理器Composer会为项目中所有PHP自动生成符合PSR标准的自动加载器。Composer有效抽象了依赖管理和自动加载。