1.通用

  1. 1.PHP代码文件必须为不带BOMUTF-8编码
  2. 2.PHP文件最后必须以一个空行结束
  3. 3.PHP文件不能使用PHP关闭标签?>来结束,而是必须省略
  4. 3.1 不加上?>关闭标签,可以避免意料之外的输出错误
  5. 3.2 如果加上关闭标签,且在关闭标签后有空行,那么空行会被当成输出,导致意想不到的错误
  6. 4.每行代码不应该超过80个字符,特殊情况不能超过120个(可通过编辑器设置),超过应该折成多行或拆分语句
  7. 5.每行只能有一条语句
  8. 6.参数列表中,有默认值的参数,必须放到参数列表的末尾

2.命名

  1. 1.类,属性,常量,变量的名称必须为上下文达意的英文名称或多个英文的组合
  2. # 正例:
  3. $cars,$user,$enableCsrfValidation
  4. # 反例:
  5. $qiche,$yonghu,$a,$abc,$abc123
  6. 2.类的命名必须遵循StudlyCaps大写开头的驼峰命名规范
  7. 3.类中的常量所有字母都必须大写,单词间用下划线分隔
  8. 4.方法名称必须符合camelCase式的小写开头驼峰命名规范
  9. 5.类的属性及普通变量命名可以遵循:
  10. 5.1 小写开头的驼峰式($camelCase)
  11. 5.2 下划线分隔式($snake_case)
  12. # 要求采用$camelCase方式

3.缩进

  1. 1.代码必须使用4个空格符而不是Tab键进行缩进
  2. 1.1 在不同的编辑器中,空格的渲染效果基本一致,而制表符的宽度各有差异,可能引起页面混乱
  3. 1.2 能帮助避免在查看代码差异,打补丁,查看提交历史,以及进行注解时产生问题
  4. 1.3 使用空格也使得代码对齐更轻松
  5. 1.4 可通过编辑器设置tab=4个空格的形式来使用tab来缩进
  6. 2.控制结构的结构体主体必须有一次缩进
  7. 3.case语句必须相对switch进行一次缩进,而break语句以及case内的其它语句都必须相对case进行一次缩进

4.空行

  1. 1.namespace声明之后必须存在一个空行
  2. 2.use声明必须位于namespace声明之后,每个use语句必须新起一行,use语句块之后必须存在一个空行
  3. 3.return前面必须空一行,在控制语句中直接return(只有return这一行)则除外
  4. 4.类中各个方法之间必须存在一个空行
  5. 5.类中各个属性一般情况下不空行,但可根据业务需求将多个属性分组,若进行了分组,则组间必须存在一个空行,属性如果有注释,则注释上方必须存在一个空行

5.保持本行/自成一行

  1. 1.类的开始花括号`{`必须写在类声明后自成一行,结束花括号`}`也必须写在类主体后自成一行
  2. 2.方法的开始花括号`{`必须写在函数声明后自成一行,结束花括号`}`也必须写在函数主体后自成一行
  3. 3.控制结构的开始花括号`{`必须写在声明的同一行,而结束花括号`}`必须写在主体后自成一行

6.空格/非空格

  1. 1.控制结构的关键字后必须要有一个空格符
  2. 2.控制结构左括号`(`后一定不可有空格,右括号`)`前也一定不可有空格,右括号`)`与开始花括号`{`间必须有一个空格
  3. 3.控制结构的开始左括号`{`后和结束右括号`}`前,都一定不可有空格符
  4. 4.每行末尾不能有空格
  5. 5.参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不可有空格
  6. 6.方法及函数调用时,方法名或函数名与参数左括号之间一定不可有空格,参数右括号前也一定不可有空格,每个逗号前一定不可有空格,但其后必须有一个空格

7.修饰符

  1. 1.类的属性和方法必须添加访问修饰符(private,protected或者public),abstract以及final必须声明在访问修饰符之前,而static必须声明在访问修饰符之后
  2. # 示例:
  3. <?php
  4. namespace Vendor\Package;
  5. use FooClass;
  6. use BarClass as Bar;
  7. use OtherVendor\OtherPackage\BazClass;
  8. abstract class ClassName
  9. {
  10. protected static $foo;
  11. abstract protected function zim();
  12. final public static function bar()
  13. {
  14. // function body here...
  15. }
  16. }
  17. 2.禁止使用下划线作为前缀,来区分属性是protectedprivate

8.关键字

  1. 1.PHP的关键字必须使用小写形式
  2. # 正例:
  3. true,false,null
  4. # 反例:
  5. True,False,NULL
  6. 2.禁止使用关键字var声明属性

9.注释

  1. 1.文件署名
  2. 1.2 接<?php下一行开始写
  3. 1.2 主要内容包括[由哪个编辑器生成,作者,日期,时间]
  4. 1.3 一般可由编辑器配置自动进行生成
  5. 1.4 文件署名必须要有
  6. # 示例:
  7. <?php
  8. /**
  9. * Created by IntelliJ IDEA.
  10. * User: Michael
  11. * Date: 2015/08/01
  12. * Time: 10:45
  13. */
  14. namespace App\Http\Controllers;
  15. use Cache;
  16. use App\Models\SignRule;
  17. use App\Models\SignLog;
  18. use App\Models\SignExtraLog;
  19. use App\Models\SignExceptionLog;
  20. use App\Models\SignApiLog;
  21. use App\Models\IPBlackList;
  22. use Illuminate\Support\Facades\Input;
  23. class ApiController extends Controller
  24. {
  25. // class functions here...
  26. }
  27. 2.字段注释
  28. 2.1 属性/常量按需分组
  29. 2.2 可通过右方#号的方式进行简要注释,注意对齐(优先选择)
  30. 2.3 可通过//线在字段上方进行注释
  31. 2.4 不建议通过/**/进行多段注释,字段所需要的注释一般不会太多,当确实需要多段注释时也可
  32. # 示例:
  33. class SignController extends Controller
  34. {
  35. // 用户ID
  36. private $memberID;
  37. // 用户BP
  38. private $memberBP;
  39. // 用户名
  40. private $memberName;
  41. const ACTIVITY_ID = 7;
  42. const CACHE_TIME = 30;
  43. const APP_ID = 100;
  44. const MERCHANT_NO = 600;
  45. const API_URL = 'http://10.10.10.10/HDEP/ProcessWeb'; #HWM API URL地址
  46. const API_KEY = 'F383A21556C3A9dsfnlslfjiedxddfprod'; #HWM API KEY
  47. // class functions here...
  48. }
  49. 3.方法注释
  50. 3.1 作者
  51. 3.2 时间,格式为Y/m/d H:i
  52. 3.3 参数,每个参数一行,接参数类型,参数名,[参数说明]
  53. 3.4 返回值,接返回值类型,[返回值说明]
  54. 3.5 描述,接[对该方法的简要描述]
  55. # 注意以上各项对齐,注释的自定义可通过编辑器设置注释模板实现
  56. # 示例:
  57. /**
  58. * @author Michael
  59. * @time 2015/08/02 15:32
  60. * @param mixed $data [数组或对象]
  61. * @param boolean $isExit [是否直接退出]
  62. * @return string [序列化后的字符串]
  63. * @desc [将数组或对象转换成json]
  64. */
  65. public static function toJson($data, $isExit = true)
  66. {
  67. if ($isExit) {
  68. exit(json_encode($data, JSON_UNESCAPED_UNICODE));
  69. }
  70. return json_encode($data, JSON_UNESCAPED_UNICODE);
  71. }
  72. 4.代码注释
  73. 4.1 代码注释尽量使用//进行注释,//后面接一个空格再加注释描述
  74. 4.2 相对重要或复杂的逻辑强制要求进行注释
  75. 4.3 对于代码逻辑明显有分步倾向的,注释要求接序号

10.细节处理

10.1 结构主体为单行

  1. # 每个结构体的主体都必须被包含在成对的花括号之中(即使结构主体只有一行也不能省略花括号),这能让结构体更加标准化,以及减少加入新行时,出错的可能性

10.2 if语句

  1. # 标准的if结构如下代码所示,请留意括号,空格以及花括号的位置,注意else和elseif都与前面的结束花括号在同一行
  2. # 示例:
  3. <?php
  4. if ($expr1) {
  5. // if body
  6. } elseif ($expr2) {
  7. // elseif body
  8. } else {
  9. // else body;
  10. }
  11. # 必须使用关键词elseif代替所有else if,以使得所有的控制关键字都像是单独的一个词,虽然两者效果是一样的

10.3 过长处理

  1. 1.extendsimplements必须写在类名称的同一行,如果过长,implements的实现列表可以分成多行,这样的话,每个实现的接口都必须分开独立成行,包括第一个,同时每行缩进4个空格
  2. # 示例1(较短直接成一行):
  3. <?php
  4. namespace Vendor\Package;
  5. use FooClass;
  6. use BarClass as Bar;
  7. use OtherVendor\OtherPackage\BazClass;
  8. class ClassName extends ParentClass implements \ArrayAccess, \Countable
  9. {
  10. // class functions here...
  11. }
  12. # 示例2(较长将实现的接口折成多行,包括第一行):
  13. <?php
  14. namespace Vendor\Package;
  15. use FooClass;
  16. use BarClass as Bar;
  17. use OtherVendor\OtherPackage\BazClass;
  18. class ClassName extends ParentClass implements
  19. \ArrayAccess,
  20. \Countable,
  21. \Serializable
  22. {
  23. // class functions here...
  24. }
  25. 2.方法参数列表折成多行,这样,包括第一个参数在内的每个参数都必须单独成行,同时每个参数缩进4个空格,折成多行后,结束括号以及方法开始花括号必须写在同一行,中间用一个空格分隔
  26. # 示例:
  27. <?php
  28. namespace Vendor\Package;
  29. class ClassName
  30. {
  31. public function aVeryLongMethodName(
  32. ClassTypeHint $arg1,
  33. &$arg2,
  34. array $arg3 = []
  35. ) {
  36. // function body here...
  37. }
  38. }
  39. 3.方法/函数调用参数折成多行,此时包括第一个参数在内的每个参数都必须单独成行
  40. # 示例:
  41. <?php
  42. $foo->bar(
  43. $longArgument,
  44. $longerArgument,
  45. $muchLongerArgument
  46. );

10.4 数组处理

  1. 1.数组全部强制要求使用[]的方式,禁止使用array()的方式
  2. 2.单行定义数组时,最后一个元素必须不加`,`号,并且`,`号后面必须有一个空格,多行定义数组时,最后一个元素必须加上`,`
  3. # 正例:
  4. $nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  5. $users = [
  6. "John",
  7. "Scarlett",
  8. "Michael",
  9. "Steve",
  10. ];
  11. # 反例:
  12. $nums = [1, 2, 3, 4, 5, 6, 7, 8, 9,];
  13. $users = [
  14. "John",
  15. "Scarlett",
  16. "Michael",
  17. "Steve"
  18. ];

10.5 赋值/对齐处理

  1. 1.赋值语句中`=`左右必须至少保留一个空格
  2. 2.赋值语句块以`=`进行左右对齐(编辑器可设置)
  3. 3.关联数组中的各数组元素以`=>`对齐
  4. # 示例:
  5. <?php
  6. /**
  7. * Created by IntelliJ IDEA.
  8. * User: Michael
  9. * Date: 2015/08/02
  10. * Time: 11:45
  11. */
  12. namespace App\Http\Controllers\Api;
  13. use App\Models\GroupDistributorCompany;
  14. use App\Models\GroupLogisticsCompany;
  15. use App\Models\User;
  16. use App\Models\DistributorCompany;
  17. use App\Models\Driver;
  18. use App\Models\LogisticsCompany;
  19. use App\Http\Controllers\Controller;
  20. use Illuminate\Support\Facades\Input;
  21. use Illuminate\Support\Facades\DB;
  22. use Illuminate\Support\Facades\Cache;
  23. class LoginController extends Controller
  24. {
  25. /*
  26. * 状态码标识
  27. */
  28. const LOGIN_FAIL = 'returninfo.login.fail';
  29. const LOGIN_SUCCESS = 'returninfo.login.success';
  30. const LOGIN_NOT_EXISTS = 'returninfo.login.not_exists';
  31. const LOGIN_PASSWORD_ERROR = 'returninfo.login.password_err';
  32. const LOGIN_ACCOUNT_FORBIDDEN = 'returninfo.login.account_forbidden';
  33. const REGISTER_SUCCESS = 'returninfo.register.success';
  34. const REGISTER_FAIL = 'returninfo.register.fail';
  35. const REGISTER_ALLREADY_EXISTS = 'returninfo.register.allready_exists';
  36. const REGISTER_NO_CHOOSE_LOGISTICS = 'returninfo.register.no_choose_logistics_compnay';
  37. const REGISTER_LOGISTICS_NOT_EXISTS = 'returninfo.register.logistics_company_not_exists';
  38. const REGISTER_NO_CHOOSE_DISTRIBUTOR = 'returninfo.register.no_choose_distributor_company';
  39. const REGISTER_DISTRIBUTOR_NOT_EXISTS = 'returninfo.register.distributor_company_not_exists';
  40. const VERIFY_SUCCESS = 'returninfo.verify_code.success';
  41. const VERIFY_FAIL = 'returninfo.verify_code.fail';
  42. const VERIFY_ALLREADY_SEND = 'returninfo.verify_code.allready_send';
  43. const VERIFY_CODE_ERROR1 = 'returninfo.verify_code.cache_err';
  44. const VERIFY_CODE_ERROR2 = 'returninfo.verify_code.code_err';
  45. const VERIFY_PHONE_ERROR = 'returninfo.verify_code.phone_err';
  46. const VERIFY_SEND_ERROR = 'returninfo.verify_code.send_err';
  47. const VERIFY_CACHE_PREFIX = 'common.verify_cache_prefix';
  48. const VERIFY_CACHE_TIME = 'common.verify_cache_time';
  49. const SUCCESS = 'returninfo.common.success';
  50. const FAIL = 'returninfo.common.fail';
  51. /*
  52. * 短信模板ID
  53. */
  54. const SMS_VERIFY = 'common.sms_template.verify';
  55. const SMS_DRIVER_REG = 'common.sms_template.driver_reg';
  56. const SMS_LOGISTICS_CHECK_DRIVER = 'common.sms_template.logistics_company_check_driver';
  57. const SMS_COMPANY_REG = 'common.sms_template.company_reg';
  58. const SMS_FACTORY_CHECK_LOGISTICS = 'common.sms_template.factory_check_logistics_company';
  59. const SMS_FACTORY_CHECK_DISTRIBUTOR = 'common.sms_template.factory_check_distributor_company';
  60. public function funcName()
  61. {
  62. // function body here...
  63. return view('admin.shiporder.shiporders', [
  64. 'title' => '运单管理',
  65. 'nowNav' => '运单列表',
  66. 'shiporders' => $shiporders,
  67. 'index' => 0,
  68. 'status' => $status,
  69. ]);
  70. }
  71. }

11.示例

  1. wget https://evernote-1258366890.cos.ap-guangzhou.myqcloud.com/1910160812.php