前言php
虽然说PHP是世界上最好的语言,可是写出来的PHP代码却每每不是最美观的。究其缘由,可能正式由于PHP简单易上手,适合快速迭代的特性,致使了咱们沉浸在迅速完成需求迭代的窃喜中,却忘记了规范性、忽略了易维护性,给后人挖了无数的坑,后面维护起来简直想骂娘。各位PHPer不妨问一下本身是否曾经写过下面的代码?html
【1】一个函数写了两百行甚至更多git
【2】一个函数的参数有七八个甚至十几个github
【3】单行代码/字符串最长超过了120个字符web
【4】一个PHP文件写了几千行框架
【5】修改代码的时候没有把对应的注释也修改一下ide
【6】不使用web框架提供的封装,而是直接用$_POST, $_GET, $_SESSION这些全局变量函数
【7】……codeigniter
其实以上问题,在咱们的项目中真的全都存在。写出上面的代码并不会影响代码功能的正常运行,不过所谓前人栽树后人乘凉,杂乱的代码就像一堆杂草,后人维护一堆杂草远比一颗大树痛苦的多。这其中带来的效率损失恐怕很难量化。试想一下阅读一个500行的函数,其中的局部变量就定义了不下50个,你看到一个变量时,脑海中根本想不到这个变量表明的含义,又要回去找定义它的地方,一步步跟踪下来或许思路早就被打断了。若是阅读一个50行的函数,整个函数体在一个电脑屏幕就能够容纳,连鼠标都不用翻动就能够看到所有,这时内心会有多么舒坦。工具
一些反面的例子
【1】无边无际的函数参数
【2】写了20000多行的代码文件
【3】手拼SQL语句,“貌似”很便捷
【4】六层foreach嵌套
作出改变
曾经看到过不少开发组,意识到代码规范问题以后,会去制定本身的代码规范。曾经咱们也但愿全部的开发坐下来,你们友好地协商出一份统一的代码规范。然而,这么作第一是很花时间,第二是不够细致,讨论中很难涉及到编码中的全部方面,第三也是最重要的一点,根本没法达成一致……想必你们都据说过程序界的一个经久不衰的段子,就是编码应该用空格缩进仍是用tab缩进。恰恰代码规范这种东西,它是没有标准答案的,你能够列出10条使用空格作缩进的好处,但立刻就会有人提出10条使用tab作缩进的好处。“讨论”这种方式根本行不通。
要想让你们指定并遵循一个没有标准答案的“标准”,光靠讨论是出不来结果的,这个时候咱们须要的可能就是“权威”以及“强权”。“权威”是指去寻找业界大牛们究竟是怎么作的,把他们的作法做为咱们的“标准”总归不会有错。“强权”则是指肯定了“标准”之后,依靠开发leader去强推给组内全部人,没有讨论的余地。“权威”保证了代码规范的正确性,“强权”保证了代码规范的执行力。
谁是“权威”?
有了上面的思路之后,咱们就要讨论一下谁的代码规范才能表明“权威”。平时使用PHP作Web开发,想必你们必定会用到各类PHP框架,例如Laravel,Symfony,Yii Framework,Zend Framework等等。做为全球知名的开源框架,这些框架里的代码应该是很是符合规范的。那么他们符合的是什么变那么规范呢?
其实随便一搜索你就能够找到了,绝大多数框架都遵循PSR(PHP Standard Recommendation)规范。PSR是由一个叫作PHP-FIG(Framework Interoperability Group)的组织经过民主投票的方式制定出来的规范。早在2009年的一次PHP技术会议上,各个PHP框架的做者自发成立了PHP-FIG组织,该组织的主要目的是但愿给各个框架做者们提供一些优秀的设计规范并但愿各个框架统一遵照。所以PSR其实表明了框架的设计规范,包括但不只仅是代码书写规范。
PSR规范目前有从PSR一、PSR二、……、PSR17(还在扩展中)等十几项规范,涵盖了PHP Web框架设计的方方面面。而咱们最关心的其实应该是PSR1和PSR2,这两个所描述的正式PHP编码的规范。有兴趣的话你们能够去他们的官方网站瞧一下(http://www.php-fig.org/),包括目前都有哪些规范、哪些正在制定中、组织的介绍等等。
目前绝大多数PHP Web框架都遵循PSR2的代码规范。
除了PSR,还有什么PHP代码规范?
当我看到PSR规范的影响力时,基本已经肯定使用它做为咱们项目中的编码规范。不过本着科学的态度,咱们仍是要了解一下业界还有哪些其它的规范。
若是你是一个PHP的老手,可能之前常常会用PEAR管理PHP库(虽然目前PEAR已经彻底被Composer盖住了风头)。PEAR也有一套本身的代码规范(连接:https://pear.php.net/manual/en/standards.php),PEAR规范应该属于PHP最先期的规范了,不少其余代码规范都从它演化而来。它的要求也是最为宽松的。
若是你据说过PHP代码检查与美化工具PHP Code Sniffer(https://github.com/squizlabs/PHP_CodeSniffer),那必定能够看到其中提供的MySource、Squiz、PHPCS规范。PHP Code Sniffer是一个叫Squiz的公司开源出来的工具,因此确定要推荐一把本身公司使用的代码规范,即Squiz规范,该规范比PSR要严格不少。举个例子,下面的写法在PSR2中没有不符合规范,可是在Squiz中是不合规范的。Squiz规定,一个类内部须要引用自身的时候,不得使用类名,而是使用self。
class Test { public function getInstance() { return new Test(); // 符合PSR,但不符合Squiz规范,Squiz规范要求这里写为 new self(); } }
PHPCS则是PHP Code Sniffer工具自身的代码使用的规范,比Squiz稍宽松一些,可是依然比PSR严格不少。而MySource规范则是最严格的一个,用于该公司的MySource Mini项目,其中不只有PHP规范,甚至还有JS和CSS的规范。一个工具居然提供了三个本身公司的规范……
简单总结一下:
严格程度 PEAR < PSR < PHPCS < Squiz < MySource
流行程度 PSR > PEAR > 其余
实际上,除此以外还有一些PHP框架也提供了属于本身框架的规范,例如CodeIgniter(http://codeigniter.org.cn/user_guide/general/styleguide.html)。比较奇怪这个框架为何没有加入PHP-FIG,不过这类框架本身定义规范通常都比较小众。若是你使用了CodeIgniter,那固然是建议遵循框架自身的规范。这里就再也不详细研究了。
根据PHP Code Sniffer做者的推荐,若是你还不知道用哪一个好,那就先尝试用PSR2吧!
如何行动?
其实在规范执行的过程当中,咱们最开始必定会碰到不少困难。好比本身原本的代码书写习惯和规范不同,刚一调整的时候会有些别扭;动辄数十页的规范内容,根本记不住,怎么办?PSR2的代码规范连接以下:http://www.php-fig.org/psr/psr-2/,看上去滚动条很短,页面内容太多,实际上它们彻底能够压缩在一张纸上。在组内项目开发中,把PSR2用中文稍加翻译(表达一样意思,中文语句比英文短不少),缩小一些字号,放在一张纸上打印出来,贴在办公桌上,时间久了天然能够养成一个好的习惯。此方法在项目组内实行一段时间后,效果喜人。
结语
写了一大长篇PHP代码规范,却没有出现任何规范的详细内容。主要由于通常在博客里面写的长篇大论的规范貌似你们都不喜欢看~做为“漫谈”,只是记录一下本身寻找一份“科学”的代码规范的过程。规范的内容有些可能与你平时的习惯不太一致,不过这就是各个PHP Web框架开发者一致的选择。
参考连接:
1. PHP-FIG官网 http://www.php-fig.org/
2. PSR2规范 http://www.php-fig.org/psr/psr-2/
3. PHP Code Sniffer https://github.com/squizlabs/PHP_CodeSniffer
4. SquizLabs官网 http://www.squizlabs.com/
5. PEAR代码规范 http://pear.php.net/manual/en/standards.php