一、基本约定
1.编码规范
2、代码注释规范
-
代码注释标签:
@access 该标记用于指明关键字的存取权限:private、public或proteced 使用范围:class,function,var,define,module
@author 指明作者
@deprecated 指明不用或者废弃的关键字 使用范围:class,function,var,define,module,constent,global,include @const 使用范围:define 用来指明php中define的常量
@final 使用范围:class,function,var 指明关键字是一个最终的类、方法、属性,禁止派生、修改。
@global 指明在此函数中引用的全局变量
@abstrcut 说明当前类是一个抽象类
@param 指明一个函数的参数
@return 指明一个方法或函数的返回值
@static 指明关建字是静态的。
@var 指明变量类型
@version 指明版本信息
@todo 指明应该改进或没有实现的地方
@throws 指明此函数可能抛出的错误异常,极其发生的情况 常用标签有 @param、@return、@author、@todo、@throws 不要另外去创造新的标签。
更多标签可查看PHP Document Tag -
注释模板示例:
-
文件头部注释(可选,单一类文件只写类注释即可)
/** * 这是一个什么文件 * * 此文件程序用来做什么的(详细说明,可选。)。 * @author hcg */
-
类注释
/** * 类的介绍 * * 类的详细介绍(可选。)。 * @author hcg */ class Test { }
-
方法头部注释
/** * 方法的含义说明 * * @access public * @param int $param1 参数一的说明 * @param array $param2 参数二的说明 * @param mixed $mixed 这是一个混合类型 * @return array * * @author hcg */ public function thisIsFunction($param1, $param2, $mixed) { return array(); }
-
-
参数名、属性名、标签的文本 上下要对齐;
-
注释的原则是将逻辑解释清楚,并不是越多越好,因为注释也是有维护成本的,代码逻辑迭代修改时注释也需要同步修改;
-
若干语句作为一个逻辑代码块时,可以使用块段落注释/* :START*//* :END*/方式把代码段包裹起来;
-
具体到某一个语句的注释,可以使用行注释://,// 后面需要加一个空格;
-
除了PHP语法外的逻辑业务也需要添加实现步骤的注释;
public function actionInfo ($aid) { /* 获取接口缓存数据,当缓存数据为空时,获取真实数据并添加接口缓存数据。:START*/ //获取接口缓存数据 $result = $this->cache(); if(!$result){ $service = ActiveService::getInstance(); //获取真实数据 $result = $service->GetInfo($aid); //添加接口缓存数据 $this->addCache($result); } /* 获取接口缓存数据,当缓存数据为空时,获取真实数据并添加接口缓存数据。:END*/ }
3、业务模块
(1)、涉及到多个数据表 更新/添加 操作时,最外层要用事务,保证数据库操作的原子性;
(2)、Model层,只做简单的数据表的查询;
(3)、业务逻辑统一封装到 Logic/Service层;
(4)、控制器只做URL路由,不要当作 业务方法 调用;
(5)、控制器层不能出现SQL操作语句,如 ThinkPHP框架的 where()、order() 等模型方法,
即,控制器中,不要出现类似这样的SQL语句:D('XXX')->where()->order()->limit()->find();
where()、order()、limit() 等SQL方法只能出现在 Model层、业务层!
4、MYSQL规范
-
一、MySQL数据库命名规范
(1)、数据库所有表前缀均使用项目名称首字母缩写;
(2)、数据库所有对象名称均使用小写字母,并且单词之间通过下划线分开;
(3)、数据库所有存储相同数据的列名和列类型必须保持一致。 -
二、MySQL数据库基本设计规范 (1)、若无特殊说明,建表时一律采用Innodb存储引擎;
(2)、选择合适的引擎可以提高数据库性能,如InnoDB和MyISAM,InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型, 这两个表类型各有优劣,视具体应用而定;基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持; MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能; 因此,其支持事务处理、支持外键、支持崩溃修复能力和并发控制是我们建表时首选的存储引擎。
(3)、数据库和表的字符集统一使用utf8;
(4)、数据库和表的字符集统一使用utf8,若是有字段需要存储emoji表情之类的,则将表或字段设置成utf8mb4; 因为,utf8号称万国码,其无需转码、无乱码风险且节省空间,而utf8mb4又向下兼容utf8。
(5)、设计数据库时所有表和字段必须添加注释; (6)、单个表的数据量大小控制在500万以内; (7)、尽量满足冷热数据分离,减小表等宽度;
(8)、数据库中禁止存储图片、文件等大的二进制数据。 (9)、尽可能把所有列定义为NOT NULL,索引NULL列需要额外的空间来保存,所以要占用更多的空间, 进行比较和计算时要对NULL值做特别的处理 -
三、MySQL数据库字段设计规范
(1)、优先选择符合存储需要的最小的数据类型; (2)、避免使用TEXT、BLOB数据类型; (3)、避免使用ENUM枚举类型; (4)、尽量使用INT类型存储时间戳,避免使用TIMESTAMP(4字节)或DATETIME(8字节)类型存储时间, INT类型存时间戳,占用资源少,查询速度快,条件范围搜索使用between没什么问题,查询条件自由拼接。 DATETIME和TIMESTAMP相对于INT来说也有一个小小的好处,就是对于时间类型来说,可以有一系列的时间函数可以用; (5)、财务相关的金额类数据必须使用(精准浮点)decimal 类型,Decimal类型为精准浮点数,在计算时不会丢失精度。 -
四、MySQL索引设计规范
(1)、每张表的索引数量不超过5个;- 索引并不是越多越好!索引可以提高效率同样可以降低效率。
- 索引过多会增加mysql优化器生成执行计划的时间,同样会降低查询性能。
(2)、对于联合索引来说,要遵守最左前缀法则 - 字段长度小、区分度最高及使用最频繁的列放在联合索引的最左侧
(3)、避免建立冗余索引和重复索引 - 重复索引示例:primary key(id)、index(id)、unique index(id)
- 冗余索引示例:index(a,b,c)、index(a,b)、index(a)
(4)、每个Innodb 表必须有一个主键;
(5)、尽量避免使用外键约束,但一定要在表与表之间的关联键上建立索引,外键会影响父表和子表的写操作从而降低性能。
(6)、常见索引列建议 - 出现在SELECT、UPDATE、DELETE语句的WHERE从句中的列
- 包含在ORDER BY、GROUP BY、DISTINCT中的字段
- 并不要将符合1和2中的字段的列都建立一个索引, 通常将1、2中的字段建立联合索引效果更好
- 多表join的关联列