ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
基本要求 项目需要使用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隔开 ~~~ 多行注解 ~~~ /** * 多行注解使用 * 这个 */ ~~~