## 一、规范前言篇
标准化不是特殊的个人风格,它让程序员可以了解任何代码,弄清程序的状况;新人可以很快的适应环境;防止新接触php的人一次次的犯同样的错误;在一致的开发环境下,可以减少人们犯错的机会。
## 二、命名定义篇
**函数变量命名**
使用英文名词、动词,以下划线作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写,例:
~~~
$repeat_count = '';
$del_user_sql = '';
~~~
**类属性命名**
使用英文名词、动词,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写,不使用下划线,不可缺省属性描述符例如:`public、protect、private`
~~~
/**
* 服务端信息
* @var array
*/
protected $server = [];
/**
* 数据库配置
* @var array
*/
public $dbConfig = [];
/**
* 路由配置
* @var array
*/
static public $route = [];
~~~
**全局常量命名**
使用英文名词、动词,所有字母都使用大写,以下划线分隔每个单词,例:
~~~
define( 'WEBSITE_NAME', '名称' );
define( 'WEBSITE_URL', '地址' );
~~~
**全局变量命名**
使用英文名词、动词,所有字母都截取首字母并且为大写,首个字符以下划线分割且以下划线分隔每个单词,例:
~~~
$_OG = [];
$_OGDB = [];
~~~
**数组变量命名**
使用英文名词、动词,以下划线作为单词的分隔,单词的首个字母使用小写,以字符串Array为后缀,例:
~~~
$scope_array = array();
$bookId_array = array();
~~~
**对象变量命名**
使用英文名词、动词,以大写字母作为单词的分隔且在后面加上对象的扩展后缀,其他的字母均使用小写,单词的首个字母使用大写,不使用下划线,例:
~~~
$userModel = new UserModel()
$wechatTool = new WechatTool();
~~~
**静态方法编写规范**
* 静态公共方法的命名以下划线作为每个单词的分割符。
* 在公共全局方法中为了避免方法重新定义请加上`function_exists`的判断。
* 每个方法需要写明注释并且参考以下格式。
~~~
if(!function_exists('input')) {
/**
* 获取请求参数,类似于tp
* @access protected
* @param string|false $name 变量名
* @param mixed $default 默认值
* @return mixed
*/
function input($name = '', $default = null)
{
global $_GPC;
if (empty($_GPC)) {
$_GPC = array_merge($_GET,$_POST,$_COOKIE);
}
return isset($_GPC[$name]) ? $_GPC[$name] : $default;
}
}
~~~
**类编写规范**
* 目录使用小写+下划线;
* 类库、函数文件统一以`.php`为后缀;
* 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
* 类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
* **类名和类文件名保持一致**,统一采用驼峰法命名(首字母大写);
~~~
// +----------------------------------------------------------------------
// | onegow [ WE CAN DO IT MORE SIMPLE]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2018 http://onegow.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: MeYe Email:55585190@qq.com
// +----------------------------------------------------------------------
defined('IN_IA') or exit('Access Denied');
class User extends Base
{
/**
* 用户信息
* @var array
*/
protected $user = [];
/**
* 用户中心首页
*/
public function index()
{
$this->assign('user',$this->user);
return $this->view();
}
}
~~~
## 三、语法书写篇
**大括号{}规则**
将大括号左边放在和判断语句同一列且多一个空格,右边则放在下方和左边对齐,例:
~~~
if ( $condition ) {
...
}
~~~
**代码缩进规则**
使用制表符缩进(TAB键)或四个空格。如果缩进层数大于四的时候,请重新设计该项业务逻辑的算法。
**小括号()规则**
不要把小括号和关键词、方法名、方法参数紧贴在一起,要用一个空格分隔,例:
~~~
if ( $condition ) {
...
}
function addAccount( $inputDataArray ) {
...
}
~~~
**if .. else ... 规则**
~~~
if ( $condition1 ) {
...
} else if ( $condition2 ) {
...
} else {
...
}
~~~
尽可能避免以下使用方式,例:
~~~
if ( $condition1 )
...
else
...
~~~
**switch规则**
每个case块结束处必须加上break,而default总应该存在处理未知情况,例:
~~~
switch( $condition )
{
case $value1:
...
break;
case $value2:
...
break;
default:
...
break;
}
~~~
**声明定位规则**
声明代码块需要对齐,且初次使用变量时需要初始化,例:
~~~
$tableName = '';
$databaseObject = '';
~~~
不使用以下方式,例:
~~~
$tableName;
$accuntName = '';
$databaseObject = '';
~~~
**数组定义规则**
数组元素代码块需要对齐,例:
~~~
$sqlData = [
'nickname' => 'MrYe',
'age' => '20',
'height' => '173cm',
];
~~~
## 四、其它说明篇
所有类方法必须有返回值,除结果简单外返回true或者false之外,其它方法应返回不同的值。
不要采用缺省方法测试非零值,必须显式测试,例:
~~~
if( false != $this->isAjax() ) {
} else {
}
~~~
不要使用以下方式,例:
~~~
if( $this->isAjax() ) {
} else {
}
~~~
不要使用三元逻辑符 ? :,但对变量的赋值除外,例:
~~~
$_GET['act'] = !empty( $_GET['act'] ) ? $_GET['act'] : 'v_login';
~~~
* 对于get、post、session、cookie类型变量,必须使用框架内部方法进行定义和调用。
* 尽可能使用单引号''而不是双引号''。
* 使用完毕后的数组变量、对象变量、查询集合必须马上使用unset()、free\_result()释放资源。
* 一个php文件只能包含一个类定义编码,以类名称作为文件名称。
* 如果发觉您在程序中的命名只有少量能和其对应事物相匹配的话,请重新设计系统。
* 在为类命名前首先要知道它是什么。如果通过类名提供的线索,您还是想不起这个类是什么的话,那么您的设计是做得不够好。
* 超过三个单词组成的混合名是容易造成系统各个实体间的混淆,请重新设计类。
* 通常每个方法只执行一项逻辑动作事务,所以对它们的命名应该清楚的说明它们是做什么的:用checkForErrors()代替errorCheck(),用dumpDataToFile()代替dataFile()。
## 五、程序注释篇
**类的注释**
~~~
// +----------------------------------------------------------------------
// | onegow [ WE CAN DO IT MORE SIMPLE]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2018 http://onegow.com All rights reserved.
// +----------------------------------------------------------------------
// | Author:【作者名称】 Email:【作者邮箱】
// +----------------------------------------------------------------------
// | 【类的用途】
// +----------------------------------------------------------------------
~~~
**类方法的注释**
~~~
/**
* 【方法的用途】
* @param integer $id 用户id
* @return array|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
~~~
**类属性的注释**
~~~
/**
* 【类属性的说明】
* @var null
*/
~~~
**代码流程注释**
~~~
//判断是否是ajax请求
if( $this->isAjax() ) {
} else {
}
~~~