曾经有这样一个故事:

小李:超哥啊,我想要写个脚本去注册域名,按照汉字组词拼音来注册域名,发现市面上的汉字词组转拼音的工具不好用啊,都TM是个什么烂鬼。
超哥:恩,我去看了一下,确实都不好用啊。放心吧,这下我又可以造轮子了。
……
几天后,超哥什么话也没有说,向小李抛了一个包,你拿去用吧。

当我们开始一个新的项目,首先我们需要考虑如何进行开发?
通常情况下,可能的方式有:

  • 手动创建
  • 选择合适的框架(比如说Laravel)
  • 组件式开发(Components Development)?

靠,what is component?
严格地说,PHP组件就是一系列相关的类、接口和特性(trait)来解决某个特定的问题。组件中的类、接口和特性通常是放在同一个命名空间中。

可能你又会想,为什么我要使用PHP组件?这个问题问得不错!

我们使用组件开发是为了不重新实现已经实现了的功能,这样就可以把时间花在未实现功能上的开发。使用组件开发,可能是因为时代不一样了,现代的PHP已经很少使用庞大的框架,而是使用具有相互操作性的组件制定解决方案。有的时候,框架不一定能满足我们的需求,这个时候我们通常去自己开发一个新的功能,框架也很难集成第三方的库或者自定义的库,因为他们之间没有使用相同的接口。现在我们可以不受限于框架的束缚,如果想快速完成一个应用的开发,不使用组件自己去重新发明轮子,是不是有点傻呢?

这里想说明的是框架和组件的一些对比。

前面也提到了,框架虽然很强大,给我们提供了很多工具,但总会出现框架解决不了我们现有的需求问题,这个时候我们通常的做法就是自己开发功能,我们自定义的库又很难集成到框架中。一个好框架需要花费大量的投入时间来维护,我们在选择一个框架的时候要着眼框架的未来。(这么说,PHP组件是不是要比框架好呢?其实也不能这样说,PHP组件也有可能会终止开发的可能,尤其是只有一个核心开发者,万一坚持不下去呢?)

那是不是框架一无是处呢?其实框架并不是一无是处。像laravel这样的现代流行的PHP框架,代码很优雅。(虽然laravel没有使用PSR-2社区标准,但仍然是一个相当出色的框架)还有一些古老的框架也在向现代PHP转变,比如内容管理框架Drupal。之前的Drupal7还是使用过程式PHP代码编写,代码还在全局命名空间中,舍弃了现代PHP,支持陈旧的代码根基。但是到了Drupal8使用不同的PHP组件构建了一个现代化的内容管理平台,向现代PHP靠拢!这个对Drupal8点个赞(我入职第一周看Drupal7的项目,看了两天的代码,一脸的懵逼,后来放弃了!)。

在菜市场买菜,菜有好的跟不好的区分,PHP组件也是这样的。所以说,我们不能认为只要是PHP组件的开发都是好的!下面还是说说好的PHP组件长得是什么样子:

  • PHP组件的代码小巧玲珑,短小精悍,解决某个问题却使用很少的代码。一个PHP组件可以是一个类,也可以是多个类,分别放在不同子命名的空间里。组件中类没有限定数量,根据自己的解决问题的需求。
  • PHP组件的功能单一。我们常说单一功能职责化,代码模块化。组件不是万能的,而是讲究术业有专攻,就是解决特定问题。
  • PHP组件之间的相互协调性,一个组件解决一个问题,一个项目解决多个问题。所以PHP组件代码放在自己的命名空间,防止与其他组件冲突。
  • PHP组件的测试良好,因为短小精悍,所以测试比较简单。最好本身提供测试,并且有充足的覆盖度。
  • 有完善的文档,有完善的文档,有完善的文档。组件要让使用者,易于安装,理解和使用。所以说写一个好的README文档真的很重要。要想提高的自己开发的组件的知名度,首先,组件确实好;其次,就是提供相当nice的README文档【这个要去学一下】。还有源码中也要有详细的注释,为组件中的类、属性和方法添加行内容文档块,说明参数、返回值和可能抛出的异常。

关于最后的选择,究竟我是选择使用组件式开发还是框架开发?

这个答案就是根据自己的需求来选择。其实现代的PHP框架就是在构建一些小型PHP组件上的一系列的约定。如果能通过一些PHP组件就能解决实际问题的项目就使用组件开发。组件开发能够让代码保持轻量级和灵活性,很容易将一个组件变成另外一个项目的组件。

如果是大型的项目,能够从框架的一些约定、标准和结构中受益的话,那就使用框架。因为框架能帮我们决定好多事情。但框架的灵活性较低一点,框架提供了一些拿来就用的工具,这样看来,框架也是一个很好的选择。

总之,根据自己的需求来选择适合自己的东西!