FIG制定的 PHP 规范,简称 PSR,是 PHP 开发的事实标准。FIGFramework Interoperability Group (框架可互用小组) 的缩写,由几位开源框架的开发者成立于 2009 年。该组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行发展的风格阻碍了程序设计师开发的困扰。PSRProposing a Standards Recommendation (提出标准建议) 的缩写。

PSR 原来有五个规范,分别是:

  • PSR-0 (Autoloading Standard) 自动加载标准。
  • PSR-1 (Basic Coding Standard) 基础编码标准。
  • PSR-2 (Coding Style Guide) 编码风格向导。
  • PSR-3 (Logger Interface) 日志接口。
  • PSR-4 (Improved Autoloading) 自动加载的增强版,可以替换掉 PSR-0 了。

今天我们的代码规范是基于以上规范进行了整理。

1、PHP 源文件只能使用 <?php<?= 这两种标签

<?php 标签通常用于纯 PHP 的脚本当中,而 <?= 通常用于模板当中。

2、PHP 源文件必须是不带 BOMUTF-8 编码的文件

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码。

3、PHP 源文件缩进采用 4 个空格

很多编辑器使用 Tab 作为缩进。会造成空格性问题。

4、纯 PHP 代码的源文件关闭标签 ?> 必须省略

PHP 解析器在对文件进行解释的时候,会有性能提升。并且,这能一定程序避免在 ?> 之后有多余的空格导致程序报错。

5、请严格控制每行 120 个字符

过长的代码会导致多种分辨率的显示器造成兼容问题。并且,过长的代码也会造成难以阅读理解。如果实在太长,请把代码换行。

6、所有的类必须设定一个命令空间

命令空间给代码结构有较强的说明性,以及杜绝同名类的冲突问题。同时,也能用到 Composer 的自动加载优势特性。

<?php
namespace core;

7、命名空间(namespace)的声明后面必须有一行空行

空行会让代码看起来更加清晰容易阅读。

<?php
namespace core; use common;

8、所有的导入(use)声明必须放在命名空间(namespace)声明的下面

这样会让代码结构变得清晰容易阅读。

<?php
namespace core; use common;

9、一句声明中,必须只有一个导入(use)关键字

虽然 PHP 允许一行代码当中允许使用多个 use 关键字导入一个类。但是,这会使代码阅读造成障碍。

错误:

<?php
namespace core; use common, library;

正确:

<?php
namespace core; use common;
use library;

10、在导入(use)声明代码块后面必须有一行空行

空行让代码结构变得容易理解。

<?php
namespace core; use common;
use library; class Person { }

11、PHP 关键字必须小写

PHP 的关键字,必须小写,boolean 值:true,false,null 也必须小写。下面的关键字,也必须小写:

'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

12、继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。

<?php
namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行
{ // 换行写{ }

13、成员属性访问修饰符必须显示声明不能省略

成员属性有三种访问修饰符:publicprotectedprivate。不能使用老式的 var 来声音成员属性。

<?php
namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
public $foo = null;
private $name = 'sam';
protected $age = '17';
}

14、成员方法访问修饰符必须显示声明不能省略

成员方法有三种访问修饰符:publicprotectedprivate

错误:

<?php
namespace Lib\Databases; class MySQL
{
function fetchOne()
{
// ......
}
}

正确:

<?php
namespace Lib\Databases; class MySQL
{
public function fetchOne()
{
// ......
}
}

15、方法的参数有多个的时候,每个参数的逗号后面必须加个空格

namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
public getInfo ($name, $age, $gender = 1)
{
}
}

16、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明(public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。

<?php
namespace Vendor\Package; abstract class ClassName
{
protected static $foo; // static 放后面 abstract protected function zim(); // abstract 放前面 final public static function bar() // final 放前面,static 放最后。
{
// 方法主体部分
}
}

17、控制结构花括号、换行、空格等规范

if、else、elseif、switch、for、foreach、case、while、go、try、catch 等关键词后面必须加空格。可以说,没有特殊说明的情况下,基本上所有的 PHP 关键词后面都必须加空格。

流程控制语句起始的花括号是不需要另起一行。

if ($expr1) { // 左右空格
// if body
} elseif ($expr2) { // elesif 连着写
// elseif body
} else {
// else body;
} switch ($expr) { // 左右空格
case 0:
echo 'First case, with a break'; // 对齐
break; // 换行写break,也对齐。
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
} while ($expr) { // 左右空格
// structure body
} do {
// structure body; // 左右空格
} while ($expr); for ($i = 0; $i < 10; $i++) { // 注意几个参数之间的空格
// for body
} foreach ($iterable as $key => $value) { // 还是空格问题
// foreach body
} try {
// try body
} catch (FirstExceptionType $e) { // 同样也是注意空格。
// catch body
} catch (OtherExceptionType $e) {
// catch body
}

18、类名必须与文件名一样

这个很容易理解,没啥好补充说明的。除非框架有特殊的加载规则。

19、类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范

StudlyCaps 即单词首字母大写风格。有些人也称它为大驼峰。

20、方法名称必须符合 camelCase 式的小写开头驼峰命名规范

camelCase 即第一个单词首字母小写后面的单词首字母大写的风格。

21、类中的常量所有字母都必须大写,单词间用下划线分隔

CONST ORDER_STATUS = 1;

22、变量必须使用小驼峰命名风格

$cardNo   = ''; // 卡号。
$idCardNo = ''; // 身份证号。

23、参数必须使用驼峰命名风格

参数也是变量的一种。故与变量的命名风格一致。

24、所有方法的起始花括号必须另起一行。

虽然以下两种在实际开发中都是允许的。但是,为了保持代码一致。所以,必须强制使用。

错误:

<?php

class MySQL
{
public function fetchOne() { }
}

正确:

<?php

class MySQL
{
public function fetchOne()
{ }
}

25、直接在方法中写数组参数时格式如下

$object->callFunc([
'userId' => 1,
'username' => 'sam',
'age' => 20,
'sex' => 'male'
]);

26、方法参数注释

/**
* 管理后台获取优惠券发送记录。
*
* @author 7031 2018-02-23
* @modify 7031 2019-02-25 修复了 SQL 性能问题。
*
* @param int $couponId 优惠券ID。
* @param string $username 用户名。
* @param string $mobilephone 用户手机号。
* @param int $page 当前分页页码。
* @param int $count 每页显示条数。
* @param array $data 请求参数。
*
* ------------------- eg:start ---------------------
* $data = [
* 'username' => '用户账号,没有时传空字符串',
* 'age' => '用户年龄,没有时传0',
* ];
* ------------------- eg:end -----------------------
*
* @return array
*/
public static function getBackendSendHistory($couponId = -1, $username, $mobilephone, $page, $count, $data) { }

可以看出,有以下几个注释特点:

1)方法说明。

2)创建方法的同事编号以及时间。

3)修改方法的同事编号以及时间与修改的内容。

4)参数注释:类型、名称、参数说明。参数与其他注释之间要有空行。

5)参数示例:如果参数当中有复杂的参数。可以在参数下方给出示例以增强说明。

6)返回值。需要给出返回的类型。

27、方法的代码行数不能超过一屏

每个人的显示器分辨率不一样。既然不超过一屏也会出现别的同事一屏会超出的情况。所以,即使未超过一屏,也尽量保证代码行在 40 行以内。如果发现自己的代码超过了 40 行,那么就需要考虑自己的代码是不是有拆分不合理的地方。特殊情况允许超过 40 行。但是,整个方法里面的代码必须是简单的判断逻辑。不包含复杂的业务判断逻辑。因为,不同的业务判断最佳实践是单独封装一个方法。

作者:fingerQin
链接:https://www.jianshu.com/p/fa7830236de3
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 
参考:
https://www.cnblogs.com/52php/p/5841210.html
 

最新文章

  1. canvas :曲线的面积图 加渐变效果
  2. Git代码管理常用命令
  3. MySQL的学习--join和union的用法
  4. 【iOS】desctiption和debugDescription
  5. Redis学习——链表源码分析
  6. (3) 深入理解Java Class文件格式(二)
  7. Android 对 properties文件的读写操作
  8. java中静态代理,动态代理知识的补充
  9. Cannot instantiate the type HttpClient问题
  10. PAT-乙级-1025. 反转链表 (25)
  11. CENTOS install summary
  12. 【数学.前左上计数法】【HDU1220】Cube
  13. java Swing 如何添加点击可展开菜单控件( JMenuBar如何使用?)
  14. android 市场发布应用小结
  15. Java网络编程基础(Netty预备知识)
  16. Linux Rabbit的使用
  17. 深入理解JVM(2)——运行时数据区
  18. 基于UML的毕业选题系统建模研究
  19. FDMEMTABLE将修改后的数据序列为JSON
  20. 大数据入门第十二天——azkaban入门

热门文章

  1. Linux 修改终端显示bash-1.4$
  2. 分析USB平台设备模型框架(1)
  3. 用Fiddler 发送post请求
  4. Lintcode---二叉树的最大深度
  5. Python 统计代码的行数,Python脚本 统计代码
  6. 微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题
  7. 跨Server查询
  8. atitit.验证码识别step2------剪贴板ClipBoard copy image图像 attilax总结
  9. 1.GCC编译过程
  10. PHP中的正则表达式及模式匹配