基本要求
项目需要使用Composer构建,项目依赖框架需要使用composer进行安装,更新
整体项目目录结构需要符合PSR-4;
### 1.类自动载入规范
* * * * *
此处的「类」泛指所有的「Class类」、「接口」、「traits 可复用代码块」以及其它类似结构。
一个完整的类名需具有以下结构
`\<应用命名空间>(\<子命名空间>)*\<类名>`
* 应用需要用统一的命名空间;
* 常规项目的命名空间为 app;
* 通用类库的命名空间按类库需求进行设置
* 类名需要符合驼峰结构 ,且是大小写敏感的
* 文件名必须和类名相同,且已. php 结尾
具体 请看[rsp-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md)的规则
### 编码规范
* * * * *
#### 文件夹
* * * * *
文件夹名称必须符合CamelCase式的大写字母开头驼峰命名规范。
### 文件
* * * * *
PHP代码文件必须以不带BOM的 UTF-8 编码。
纯PHP代码文件必须省略最后的 ?> 结束标签。
#### 行
* * * * *
行的长度一定限制在140个字符以内。
非空行后一定不能有多余的空格符。
每行一定不能存在多于一条语句。(特别是 if 语句需要小心)
适当空行可以使得阅读代码更加方便以及有助于代码的分块(但注意不能滥用空行)。
#### 缩进
* * * * *
代码必须使用tab的缩进,不是使用4个 tab 缩进 。
#### 关键字以及 true/false/null
* * * * *
PHP所有关键字必须全部小写。
常量 true、false和 null必须全部小写。
### namespace,use声明,类注释
* * * * *
namespace 声明后必须插入一个空白行。
所有use必须在namespace 后声明。
每条use声明语句必须只有一个use关键词。
同一个类请勿重复use
不可有多余的 use,代码写完后请自行清除;
use 不可以手写,需要使用 ide的导入功能
use 声明语句块后必须要有一个空白行。
~~~
<?php
namespace cloud;
use cloud\mag\MagSite;
use rap\cache\Cache;
use rap\config\Config;
use rap\db\Connection;
use rap\web\interceptor\Interceptor;
use rap\web\Request;
use rap\web\Response;
class CloudInterceptor implements Interceptor{
~~~
### 类(class),属性(properties)和方法(methods)
* * * * *
#### 类
* * * * *
类的命名必须遵循大写字母开头的驼峰式命名规范 。
关键词 extends 和 implements必须写在类名称的同一行
类的开始花括号需要跟结尾请勿独占一行,结束花括号必须在类主体后独占一行
正确:
~~~
class CloudInterceptor implements Interceptor{
// constants, properties, methods
}
~~~
错误
~~~
class CloudInterceptor implements Interceptor
{
// constants, properties, methods
}
~~~
implements 的继承列表如果超过2个的话,每个继承接口名称都必须分开独立成行,包括第一个,此时类的开始花括号必须独占一行。
~~~
class CloudInterceptor implements
Interceptor,
StorageInterface,
CacheInterface
{
// constants, properties, methods
}
~~~
#### 常量(const)
* * * * *
类的常量中所有字母都必须大写,词间以下划线分隔。 参照以下代码:
~~~
class CloudApi{
const CLOUD_HOST ="http://cloud.local";
const APP_CONFIG ='/open/loadAppConfigs';
}
~~~
#### 变量
* * * * *
模型中和数据库对应的字段需要使用下滑线_类型命名规范;
其他属性命名必须遵循小写字母开头的驼峰式命名规范 ($camelCase)。
必须对所有属性设置访问控制(如public,protect,private)。
一定不可使用关键字 var 声明一个属性。
每条语句一定不可定义超过一个属性。
#### 方法(methods)
* * * * *
方法名称必须符合 camelCase() 式的小写字母开头驼峰命名规范。
所有方法都必须设置访问控制(如,public,protect,private)。
方法名称后一定不能有空格符,其开始花括号必须独占一行,结束花括号也必须在方法主体后单独成一行。参数左括号后和右括号前一定不能有空格。
~~~
public function toLogin(Request $request, Response $response){
}
~~~
#### 方法参数
* * * * *
方法参数名称必须符合 camelCase 式的小写字母开头驼峰命名规范
参数列表中,每个参数后面必须要有一个空格,而前面一定不能有空格。
有默认值的参数,必须放到参数列表的末尾。
如果参数类型为对像必须指定参数类型为具体的类名,如下的$asset参数。
如果参数类型为array必须指定参数类型为array。如下$info。
只有基本类型 int string boolean 等可以不指定类型
~~~
public function load(UserAsset $asset, array $info = []){
}
~~~
#### abstract 、 final 、 以及 static
* * * * *
需要添加 abstract 或 final 声明时, 必须写在访问修饰符前,而 static 则必须写在其后。
~~~
protected static $foo;
abstract protected function test();
final public static function test1() {
}
~~~
#### 方法及方法调用
* * * * *
方法及方法调用时,方法名与参数左括号之间一定不能有空格,参数右括号前也一定不能有空格。每个参数前一定不能有空格,但其后必须有一个空格。
~~~
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
~~~
方法名参数如果超过6个以上应该使用类接受
#### 操作符
* * * * *
操作符前后需要有空格 ,出 ++ --以外
~~~
$k = $x > 15 ? 1 : 2;
$k = $x ?: 0;
$i++;
~~~
方法名参数如果超过6个以上应该使用类接受
### 控制结构
* * * * *
控制结构的基本规范如下:
* 控制结构关键词后必须有空格不可紧挨(。
* 左括号 ( 后一定不能有空格,右括号 ) 前一定不能有空格。
* 右括号 ) 与开始花括号 { 间一定有一个空格。
* 结构体主体一定要有一次缩进。
* 结束花括号 } 一定在结构体主体后单独成行。
* 每个结构体的主体都必须被包含在成对的花括号之中, 这能让结构体更加标准,以及减少加入新行时,引入出错的可能性。
#### if 、 elseif 和 else
* * * * *
~~~
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
// 单个if也必须带有花括号
if ($expr1) {
return 1;
}
~~~
应该使用关键词 elseif 代替所有 else if
#### switch 和 case
* * * * *
标准的 switch 结构如下代码所示,留意括号、空格以及花括号的位置。 case 语句必须相对 switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须 相对 case 进行一次缩进。 如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。
~~~
switch ($exp){
case 0:
echo 0;
break;
case 1:
echo 1;
// no break
case 2:
case 3:
echo 'a';
return;
default:
echo 'Default case';
break;
}
~~~
#### while
* * * * *
一个规范的 while 语句应该如下所示,注意其 括号、空格以及花括号的位置。
~~~
while ($exp){
//body
}
~~~
注意不要出现死循环
不要写 do while结构,换个变通的写法
#### for
* * * * *
标准的 for 语句如下所示,注意其 括号、空格以及花括号的位置。
~~~
for ($i = 0; $i < 12; $i++){
//for body
}
~~~
#### foreach
* * * * *
标准的 foreach 语句如下所示,注意其 括号、空格以及花括号的位置。
~~~
foreach ($items as $key => $value) {
}
~~~
#### try catch
* * * * *
标准的 try catc 语句如下所示,注意其 括号、空格以及花括号的位置。
~~~
try {
// body
} catch (MsgException $msgException){
// body
} catch (\RuntimeException $exception){
// body
throw new MsgException('');
}
~~~
### 闭包
* * * * *
~~~
$config = $this->getAppConfig(function (Where $where) use ($request, $response){
});
~~~
### 注释
* * * * *
#### 文件注释
* * * * *
文件注释在 <?php namespace中间
格式如下
~~~
/**
* 统一api
*
* User: jinghao@duohuo.net
* Date: 18/5/8
* Time: 下午1:31
* Link: http://magapp.cc
* Copyright:南京灵衍信息科技有限公司
*/
~~~
#### 类注释
* * * * *
~~~
/**
* 我是类描述
*
* Class CloudApi
* @package cloud
*/
class CloudApi{
}
~~~
### 属性注释
* * * * *
所有属性都必须加上注释
需要使用@var 标明变量类型
注释需要包含基本类型 int string boolean array基本类型;
~~~
/**
* 配置项
* @var array
*/
private $config;
/**
* @var Connection
*/
private $connection;
~~~
### 方法注释
* * * * *
* 注释内容第二行还是,内容后需要空一行
* 注解顺序为@param,@throws @return,@author和@since,参数的顺序必须与方法参数顺序一致。
* @param 必须写清楚参数类型多个用|隔开
* @return 必须写清楚返回类型 多个用|隔开
* 尽量不使用mixed
~~~
/**
* 通过配置项获取CloudSite
*
* @param array $config
* @throws MsgException
* @return CloudSite
* @author 景颢
* @since 2018-11-08
*/
~~~
### 方法中的参数注解
* * * * *
方法中的参数 再不可明确时 需要添加上注解,注解需要在同一行
~~~
/* @var $cloudSite CloudSite */
$cloudSite=Ioc::get(CloudSite::class);
~~~
### 其他注解
* * * * *
* 代码注释尽量使用 //
* 注释内容开始前必须一个空格
* 代码行尾注释//前面必须一个空格
* 代码注释与下面的代码对齐
~~~
// 这是注解
$mag_site_c=$config['mag_site'];
$mag_site=new MagSite(); //这是注解,前面有个tab //多个也许tab隔开
~~~
多行注解
~~~
/**
* 多行注解使用
* 这个
*/
~~~
