# OSR **Repository Path**: jason2011/OSR1.0 ## Basic Information - **Project Name**: OSR - **Description**: OSR1.0 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-11-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## PHP开发规范(OSR1.0) 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便。 ## 关键词 > "必须" ("MUST") > > "一定不可/一定不能" ("MUST NOT") > > "需要" ("REQUIRED") > > "将会" ("SHALL") > > "不会" ("SHALL NOT") > > "应该" ("SHOULD") > > "不该" ("SHOULD NOT") > > "推荐" ("RECOMMENDED") > > "可以" ("MAY") > > "可选" ("OPTIONAL") ## 1.概述 - PHP代码文件`必须`以 ` $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // 方法的内容 } } ``` ## 2. 通则 ### 2.1. 源文件 PHP代码`必须`只使用`长标签()`或者`短输出式标签()`;而`一定不可`使用其他标签。 所有PHP文件 `必须` 使用 Unix LF (linefeed) 作为行的结束符。 所有PHP文件 `必须` 以一个空白行作为结束。 纯PHP代码文件 `必须` 省略最后的 ?> 结束标签。 ### 2.2. 副作用 一个源文件`建议`只用来做声明(`类(class)`,`函数(function)`,`常量(constant)`等)或者只用来做一些引起副作用的操作(例如:输出信息,修改`.ini`配置等),但`不建议`同时做这两件事。 短语`副作用(side effects)`的意思是 *在包含文件时* 所执行的逻辑与所声明的`类(class)`,`函数(function)`,`常量(constant)`等没有直接的关系。 `副作用(side effects)`包含但不局限于:产生输出,显式地使用`require`或`include`,连接外部服务,修改ini配置,触发错误或异常,修改全局或者静态变量,读取或修改文件等等 下面是一个既包含声明又有副作用的示例文件;即应避免的例子: ```php \n"; // 声明 function foo() { // 函数体 } ``` 下面是一个仅包含声明的示例文件;即应提倡的例子: ```php 注意:代码中只使用空格,且不和制表符混合使用,将会对避免代码差异,补丁,历史和注解中的一些问题有帮助。空格的使用还可以使通过调整细微的缩进来改进行间对齐变得更加的简单。 ### 2.5. 关键字和 True/False/Null PHP关键字([keywords][])`必须`使用小写字母。 PHP常量`true`, `false`和`null` `必须`使用小写字母。 [keywords]: http://php.net/manual/en/reserved.keywords.php ## 3. 类名及命名空间声明 `命名空间(namespace)`的声明后面`必须`有一行空行。 所有的`导入(use)`声明`必须`放在`命名空间(namespace)`声明的下面。 一句声明中,`必须`只有一个`导入(use)`关键字。 在`导入(use)`声明代码块后面`必须`有一行空行。 一个源文件中只能有一个`类(class)`。 `类名(class name)` `建议`使用`StudlyCaps`写法。 示例: ```php 前后`必须`有空格,且运算符后`必须`有一个空格 多行`数组(Array)`里每个元素`必须`自成一行 多行`数组(Array)`声明时右括号`必须`自成一行 多行`数组(Array)`最后一个值`必须`有逗号 例子: ```php 1, "b" => 2, ); ``` ### 4.4. 属性 所有的`属性(property)`都`必须`声明其可见性。 `变量(var)`关键字`一定不可`用来声明一个`属性(property)`。 一条语句`一定不可`声明多个`属性(property)`。 `属性名(property name)` `建议`使用`$camelCase`风格来声明。 `属性名(property name)` `不推荐`用单个下划线作为前缀来表明其`保护(protected)`或`私有(private)`的可见性。 一个`属性(property)`声明看起来应该像下面这样。 ```php bar($arg1); Foo::bar($arg2, $arg3); ``` 参数列表`可以`被拆分成多个缩进了一次的子行。如果拆分成子行,列表中的第一项`必须`放在下一行,并且每一行`必须`只能有一个参数。 ```php bar( $longArgument, $longerArgument, $muchLongerArgument ); ``` ## 5. 控制结构 下面是对于控制结构代码风格的概括: - 控制结构的关键词与结构之间`必须`有一个空格。 - 控制结构的左括号后 `一定不可` 有空格。 - 控制结构的右括号前也 `一定不可` 有空格。 - 控制结构的右括号与开始花括号间 `必须` 有一个空格。 - 控制结构的结构体主体 `必须` 要有一次缩进。 - 控制结构结束右花括号 `必须` 在结构体主体后单独成行。 每个结构体的主体都 `必须` 被包含在成对的花括号之中,这能让结构体更加结构话,以及减少加入新行时,出错的可能性 ### 5.1. if、elseif、else 下面是一个`if`条件控制结构的示例,注意其中括号,空格和花括号的位置。 标准的`if`结构如下代码所示,请留意「括号」、「空格」以及「花括号」的位置, 注意 `else`和`elseif`都与前面的结束花括号在同一行。 ```php $value) { // foreach body } ``` ### 5.6. try、catch 下面是一个`try catch`异常处理控制结构的示例,注意其中括号,空格和花括号的位置。 ```php bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3 ); ``` ## 8 工具使用 `建议` ### 8.1 文件头注释 `Phpstorm` > `Prefefences` >`Editor` >` File and Code Templates` >` PHP File Header ` ```php /** * Copyright (c) ${YEAR} * 摘 要: * 作 者:${USER} * 修改日期:${YEAR}.${MONTH}.${DAY} */ ``` ### 8.2 方法注释 `Phpstorm` > `Prefefences` >` Editor` >` File and Code Templates` >` PHP Function Doc Comment` ```php /** * * ${PARAM_DOC} ${THROWS_DOC} * * @return mixed */ ``` ### 8.3 代码块 `Phpstorm` > `Prefefences` >` Editor` >`Live Templates` >` Add` ```php \DB::beginTransaction(); try { $validator = \Validator::make(\Request::all(), [ 'content' => 'required' ]); if ($validator->fails()) { throw new \ErrorException($validator->errors()->first(), "101"); } //sign校验 $result = $dockingService->artCooperationEntrance($content); if (!$result) { throw new \ErrorException("验签失败", '201'); } \DB::commit(); return $this->showResult(); } catch (\Exception $exception) { \DB::rollBack(); \Log::exception($exception); return $this->showResult($exception->getCode(), $exception->getMessage()); } ``` ### 8.4 代码设置 #### 8.4.1 格式化标准 ```shell `Phpstorm` > `Prefefences` >` Editor` >`Code Style` >` PHP`> `Set From PSR1/PSR2 ``` #### 8.4.2 等号对齐 (左上角搜索) ```shell Align consecutive assignments Align key-value pairs Align contants(常量对齐) Align fields in column ```