编码规范

PHP 编码规范

命名篇

  • 变量命名
    • 所有字母都使用小写;对于一个变量使用多个单词的,使用"_"作为每个词的间隔
    • 例如:
$user_name = "tony";
$red_rose_price = 123;
  • 常量命名
    • 所有字母使用大写;多个单词间使用"_"作为间隔
    • 例如:
define('ALI_TIMESTAMP',365*24*60*60);
define('TIMING_SERVER_NAME', '106.31.89.92');
  • 类命名
    • 大驼峰命名法。以大写字母开头,多个单词组成的变量名,单词之间不用间隔,各个单词首字母大写
    • 例如:
class LearningRoomController extends BaseController
{
}

  • 方法或函数
    • 小驼峰命名法。以小写字母开头,多个单词组成的变量名,单词之间不用间隔,各个单词首字母大写
    • 例如:
function postFeed() 
{
    //业务逻辑
}

class LearningRoomController extends BaseController
{
    public function postFeed()
    {
        //业务逻辑
    }
}
  • 数据库表命名
    • 表名均使用小写字母;
    • 对于多个单词组成的表名,使用_间隔
    • 例如:
t_learning_feed_image
t_learning_farm_user_study_record
  • 表字段命名
    • 均使用小写字母;
    • 对于多个单词组成的字段,使用_间隔
    • 例如:
feed_id
actual_score
un_goal_day_count

风格篇

  • 代码缩进

    • 使用4个空格作为缩进,而不使用tab缩进
  • 大括号{ }

    • 结构控制代码编写,如if、for、while、switch等结构,大括号不换行
    • 类、方法、函数 大括号换行
for ($i = 1; $i < 10; $i++) {

}

if ($a > 1) {

}

foreach ($arr as $key => $value) {

}

function postFeed()
{

}

class A 
{
    public function a() 
    {

    }
}
  • 小括号( ) 与 运算符
    • 左括号的右边,右括号的左边不加空格
    • 每个逗号"," 分号";" 逻辑运算符">" "=" ">=" "<" 等等,前面不空格,后面空格
class A 
{
    public function a($paramsOne, $paramsTwo, $paramsThree) 
    {
        for ($i = 1; $i <= 10; $i++) {
            
        }
    }
}

  • switch break continue
    • switch 语句每个case后面要有break;最后必须要有default模块
    • 在多层嵌套语句中使用break continue 时要注意层级关系,switch的case结构会被当做一层

for ($i = 1; $i <= 10; $i++) {
    switch ($i) {
        case 1:
            echo 123;
            break;
        case 2:
            echo "nihao";
            break;
        case 8:
            break;//如果想中断for循环 则要使用 break 2; continue 同理
        default:
            echo "gan!";
    }
}

注释篇

  • 类注释
/** 
* @ Purpose: 
* 访问数据库的类,以ODBC作为通用访问接口 
* @Author: Forrest Gump [email protected] 
* @Modifications: 
* No20020523-100: 
* odbc_fetch_into()参数位置第二和第三个位置调换 
* John Johnson [email protected] 
* @See: (参照) 
*/ 
class Database 
{ 
…… 
}
  • 函数注释
/** 
* @Purpose: 
* 执行一次查询 
* 
* @Param: string $queryStr SQL查询字符串 
* @Param: string $username 用户名
* 
* @Author: Michael Lee
*
* @Return: mixed 查询返回值(结果集对象) 
*/ 
function abc($queryStr,$username)
{……}
  • 单行注释尽量写在代码上一行,而不是行尾
//定义一个用户名
$user_name = "Tony";

业务篇

  • 数据库部分
    • 1.所有新增数据表,表结构修改,必须严格遵守数据库建表规范,且由后台,微服务,PHP三组组长评审通过以后才能予以修改,且必须写明字段注释。修改完成以后必须告知所有服务端人员以及数据组相关人员。
    • 2.每次上线,应跟随代码提交所有的SQL语句,并做对应业务说明。SQL语句必须使用索引,而且要提前预估大数据量可能会导致的问题。
    • 3.对于测试数据库,如果开发和测试的时候有特殊需要,改完以后必须要予以恢复,以保证测试服数据的完整性。禁止通过任何方式私自改动生产环境数据库数据,必须经过审批且通过。
    • 4.禁止在循环里面嵌套查询。
    • 5.尽量避免连表查询,如果实在要连表查,不要超过2张表。
    • 6.避免重复查询。在一次请求的生命周期中,避免多次重复查询同一组数据。可以通过传参的方式将需要使用的数据传达给后面的函数
  • 代码部分

    • 所有表model必须存放在model 文件夹中
    • 业务实现写在service层,controller只做业务拼接
    • 避免写超过4层嵌套的if else 逻辑嵌套,复杂的逻辑拆分成多个方法,以提高代码可读性。
    • 复杂业务必须要先做好设计方案和预演。如果涉及多方,必须要一起开会讨论,确定方案
    • 业务设计要尽量减少数据库查询,尽量减少接口调用,尽量不返回多余数据的原则。对于可能会频繁访问的接口,可以多使用缓存。
    • 相同业务代码要尽量可以复用,组内人员在开发之前要沟通好,不要相同的代码写很多遍。但是也要注意,如果业务有不同,也不要强行复用,该区分的时候也要做好区分。如果有不确定的地方,可以一起讨论。
  • Git版本管理部分

    • 严格按照git分支管理策略,任何临时的需求或者小的改动,都要拉分支做开发。不同需求使用不同分支,最后按上线计划进行合并上线
    • git的commit信息要简要描述清楚提交的内容,禁止提交mmm aaa 123等无意义的字符
    • 合并代码采取提交merge request 方式。提交申请后,执行代码审查流程通过后方可合并。
  • 开发部分

    • 确保需求确认一致,各方实现方案互通后在开始开发,任何不明确的地方均要主动沟通确认并负责跟踪消息同步进度,确保需求的变更传达到每一环。
    • 发现需求中流程走不通或者产品设计特别复杂的地方,要及时与产品沟通。讨论方案可行性或者研讨优化方案。
    • 发挥主观能动性,积极推展项目进度,积极推进各方交流。不要只顾自己开发,造成互相等的情况。
    • 要有deadline意识,遇到技术难点或者自己能力不足的地方及时与组长沟通,不要等到最后才上报,导致影响项目进度节点延期。
    • 一定要注意数据的验证,使用数据前要做判空和类型鉴定,避免由于空对象,错误的数据类型导致抛出异常或者产生预期外的结果。例如数据库查询结果为空时,直接获取对象属性则会抛出异常。字符串搜索等函数要注意0和===的区别等等。
    • 严格按照项目设计去开发,使用封装好的公共方法去做数据验证和结果返回,保证返回给客户端的数据类型的一致性。
    • 所有接口一律要在showDoc上提供接口文档,标明用法,参数,返回值。对返回值中的数据要写明注释。
    • 注释清晰。复杂的方法要有流程步骤注释,函数的参数要有注释,且写明参数类型。
      多次的redis操作尽量采取pipline去操作,减少IO。尽可能的多使用缓存,同时要注意缓存穿透,雪崩等常见问题。
  • 接口设计

    • 接口参数尽量少,格式简单,避免多层嵌套参数 如数组,json字符串(特殊情况除外)
    • 返回数据要有封装意识。要对数据进行抽象,同一类型的数据,同一含义的数据在不同的接口里要保持一致。对象要进行封装再返回。禁止将所有字段揉在一起,做一个层级返回
    • 返回数据较多时,要写明注释
    • 不要在一个接口里完成所有功能,应尽可能的将不同的业务拆分成不同的接口,避免通过各种type去组合功能。
    {
      "result": true,
      "errorCode": 0,
      "errorMsg": "成功",
      "isEnd": false,
      "groupList": [
        {
          "groupInfo": { //群信息
            "id": 4182, //群id
            "name": "167、162、16", //群名称
            "createTime": 1595297040000, //群创建时间
        }
      ]
    }
  • 接口交付
    • 接口开发应先交付接口文档。再根据接口文档进行开发
    • 接口交付一定要自己完成自测,下游可用才算完成
    • 接口返回值改动要同步4端(android,ios,服务端,web端),并在群内@相关人员

你可能感兴趣的:(编码规范)