1.通用
1.PHP代码文件必须为不带BOM的UTF-8编码
2.PHP文件最后必须以一个空行结束
3.PHP文件不能使用PHP关闭标签?>来结束,而是必须省略
3.1 不加上?>关闭标签,可以避免意料之外的输出错误
3.2 如果加上关闭标签,且在关闭标签后有空行,那么空行会被当成输出,导致意想不到的错误
4.每行代码不应该超过80个字符,特殊情况不能超过120个(可通过编辑器设置),超过应该折成多行或拆分语句
5.每行只能有一条语句
6.参数列表中,有默认值的参数,必须放到参数列表的末尾
2.命名
1.类,属性,常量,变量的名称必须为上下文达意的英文名称或多个英文的组合
# 正例:
$cars,$user,$enableCsrfValidation
# 反例:
$qiche,$yonghu,$a,$abc,$abc123
2.类的命名必须遵循StudlyCaps大写开头的驼峰命名规范
3.类中的常量所有字母都必须大写,单词间用下划线分隔
4.方法名称必须符合camelCase式的小写开头驼峰命名规范
5.类的属性及普通变量命名可以遵循:
5.1 小写开头的驼峰式($camelCase)
5.2 下划线分隔式($snake_case)
# 要求采用$camelCase方式
3.缩进
1.代码必须使用4个空格符而不是Tab键进行缩进
1.1 在不同的编辑器中,空格的渲染效果基本一致,而制表符的宽度各有差异,可能引起页面混乱
1.2 能帮助避免在查看代码差异,打补丁,查看提交历史,以及进行注解时产生问题
1.3 使用空格也使得代码对齐更轻松
1.4 可通过编辑器设置tab=4个空格的形式来使用tab来缩进
2.控制结构的结构体主体必须有一次缩进
3.case语句必须相对switch进行一次缩进,而break语句以及case内的其它语句都必须相对case进行一次缩进
4.空行
1.namespace声明之后必须存在一个空行
2.use声明必须位于namespace声明之后,每个use语句必须新起一行,use语句块之后必须存在一个空行
3.return前面必须空一行,在控制语句中直接return(只有return这一行)则除外
4.类中各个方法之间必须存在一个空行
5.类中各个属性一般情况下不空行,但可根据业务需求将多个属性分组,若进行了分组,则组间必须存在一个空行,属性如果有注释,则注释上方必须存在一个空行
5.保持本行/自成一行
1.类的开始花括号`{`必须写在类声明后自成一行,结束花括号`}`也必须写在类主体后自成一行
2.方法的开始花括号`{`必须写在函数声明后自成一行,结束花括号`}`也必须写在函数主体后自成一行
3.控制结构的开始花括号`{`必须写在声明的同一行,而结束花括号`}`必须写在主体后自成一行
6.空格/非空格
1.控制结构的关键字后必须要有一个空格符
2.控制结构左括号`(`后一定不可有空格,右括号`)`前也一定不可有空格,右括号`)`与开始花括号`{`间必须有一个空格
3.控制结构的开始左括号`{`后和结束右括号`}`前,都一定不可有空格符
4.每行末尾不能有空格
5.参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不可有空格
6.方法及函数调用时,方法名或函数名与参数左括号之间一定不可有空格,参数右括号前也一定不可有空格,每个逗号前一定不可有空格,但其后必须有一个空格
7.修饰符
1.类的属性和方法必须添加访问修饰符(private,protected或者public),abstract以及final必须声明在访问修饰符之前,而static必须声明在访问修饰符之后
# 示例:
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// function body here...
}
}
2.禁止使用下划线作为前缀,来区分属性是protected或private
8.关键字
1.PHP的关键字必须使用小写形式
# 正例:
true,false,null
# 反例:
True,False,NULL
2.禁止使用关键字var声明属性
9.注释
1.文件署名
1.2 接<?php下一行开始写
1.2 主要内容包括[由哪个编辑器生成,作者,日期,时间]
1.3 一般可由编辑器配置自动进行生成
1.4 文件署名必须要有
# 示例:
<?php
/**
* Created by IntelliJ IDEA.
* User: Michael
* Date: 2015/08/01
* Time: 10:45
*/
namespace App\Http\Controllers;
use Cache;
use App\Models\SignRule;
use App\Models\SignLog;
use App\Models\SignExtraLog;
use App\Models\SignExceptionLog;
use App\Models\SignApiLog;
use App\Models\IPBlackList;
use Illuminate\Support\Facades\Input;
class ApiController extends Controller
{
// class functions here...
}
2.字段注释
2.1 属性/常量按需分组
2.2 可通过右方#号的方式进行简要注释,注意对齐(优先选择)
2.3 可通过//线在字段上方进行注释
2.4 不建议通过/**/进行多段注释,字段所需要的注释一般不会太多,当确实需要多段注释时也可
# 示例:
class SignController extends Controller
{
// 用户ID
private $memberID;
// 用户BP
private $memberBP;
// 用户名
private $memberName;
const ACTIVITY_ID = 7;
const CACHE_TIME = 30;
const APP_ID = 100;
const MERCHANT_NO = 600;
const API_URL = 'http://10.10.10.10/HDEP/ProcessWeb'; #HWM API URL地址
const API_KEY = 'F383A21556C3A9dsfnlslfjiedxddfprod'; #HWM API KEY
// class functions here...
}
3.方法注释
3.1 作者
3.2 时间,格式为Y/m/d H:i
3.3 参数,每个参数一行,接参数类型,参数名,[参数说明]
3.4 返回值,接返回值类型,[返回值说明]
3.5 描述,接[对该方法的简要描述]
# 注意以上各项对齐,注释的自定义可通过编辑器设置注释模板实现
# 示例:
/**
* @author Michael
* @time 2015/08/02 15:32
* @param mixed $data [数组或对象]
* @param boolean $isExit [是否直接退出]
* @return string [序列化后的字符串]
* @desc [将数组或对象转换成json]
*/
public static function toJson($data, $isExit = true)
{
if ($isExit) {
exit(json_encode($data, JSON_UNESCAPED_UNICODE));
}
return json_encode($data, JSON_UNESCAPED_UNICODE);
}
4.代码注释
4.1 代码注释尽量使用//进行注释,//后面接一个空格再加注释描述
4.2 相对重要或复杂的逻辑强制要求进行注释
4.3 对于代码逻辑明显有分步倾向的,注释要求接序号
10.细节处理
10.1 结构主体为单行
# 每个结构体的主体都必须被包含在成对的花括号之中(即使结构主体只有一行也不能省略花括号),这能让结构体更加标准化,以及减少加入新行时,出错的可能性
10.2 if语句
# 标准的if结构如下代码所示,请留意括号,空格以及花括号的位置,注意else和elseif都与前面的结束花括号在同一行
# 示例:
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
# 必须使用关键词elseif代替所有else if,以使得所有的控制关键字都像是单独的一个词,虽然两者效果是一样的
10.3 过长处理
1.extends和implements必须写在类名称的同一行,如果过长,implements的实现列表可以分成多行,这样的话,每个实现的接口都必须分开独立成行,包括第一个,同时每行缩进4个空格
# 示例1(较短直接成一行):
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// class functions here...
}
# 示例2(较长将实现的接口折成多行,包括第一行):
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// class functions here...
}
2.方法参数列表折成多行,这样,包括第一个参数在内的每个参数都必须单独成行,同时每个参数缩进4个空格,折成多行后,结束括号以及方法开始花括号必须写在同一行,中间用一个空格分隔
# 示例:
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
) {
// function body here...
}
}
3.方法/函数调用参数折成多行,此时包括第一个参数在内的每个参数都必须单独成行
# 示例:
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
10.4 数组处理
1.数组全部强制要求使用[]的方式,禁止使用array()的方式
2.单行定义数组时,最后一个元素必须不加`,`号,并且`,`号后面必须有一个空格,多行定义数组时,最后一个元素必须加上`,`号
# 正例:
$nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$users = [
"John",
"Scarlett",
"Michael",
"Steve",
];
# 反例:
$nums = [1, 2, 3, 4, 5, 6, 7, 8, 9,];
$users = [
"John",
"Scarlett",
"Michael",
"Steve"
];
10.5 赋值/对齐处理
1.赋值语句中`=`左右必须至少保留一个空格
2.赋值语句块以`=`进行左右对齐(编辑器可设置)
3.关联数组中的各数组元素以`=>`对齐
# 示例:
<?php
/**
* Created by IntelliJ IDEA.
* User: Michael
* Date: 2015/08/02
* Time: 11:45
*/
namespace App\Http\Controllers\Api;
use App\Models\GroupDistributorCompany;
use App\Models\GroupLogisticsCompany;
use App\Models\User;
use App\Models\DistributorCompany;
use App\Models\Driver;
use App\Models\LogisticsCompany;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache;
class LoginController extends Controller
{
/*
* 状态码标识
*/
const LOGIN_FAIL = 'returninfo.login.fail';
const LOGIN_SUCCESS = 'returninfo.login.success';
const LOGIN_NOT_EXISTS = 'returninfo.login.not_exists';
const LOGIN_PASSWORD_ERROR = 'returninfo.login.password_err';
const LOGIN_ACCOUNT_FORBIDDEN = 'returninfo.login.account_forbidden';
const REGISTER_SUCCESS = 'returninfo.register.success';
const REGISTER_FAIL = 'returninfo.register.fail';
const REGISTER_ALLREADY_EXISTS = 'returninfo.register.allready_exists';
const REGISTER_NO_CHOOSE_LOGISTICS = 'returninfo.register.no_choose_logistics_compnay';
const REGISTER_LOGISTICS_NOT_EXISTS = 'returninfo.register.logistics_company_not_exists';
const REGISTER_NO_CHOOSE_DISTRIBUTOR = 'returninfo.register.no_choose_distributor_company';
const REGISTER_DISTRIBUTOR_NOT_EXISTS = 'returninfo.register.distributor_company_not_exists';
const VERIFY_SUCCESS = 'returninfo.verify_code.success';
const VERIFY_FAIL = 'returninfo.verify_code.fail';
const VERIFY_ALLREADY_SEND = 'returninfo.verify_code.allready_send';
const VERIFY_CODE_ERROR1 = 'returninfo.verify_code.cache_err';
const VERIFY_CODE_ERROR2 = 'returninfo.verify_code.code_err';
const VERIFY_PHONE_ERROR = 'returninfo.verify_code.phone_err';
const VERIFY_SEND_ERROR = 'returninfo.verify_code.send_err';
const VERIFY_CACHE_PREFIX = 'common.verify_cache_prefix';
const VERIFY_CACHE_TIME = 'common.verify_cache_time';
const SUCCESS = 'returninfo.common.success';
const FAIL = 'returninfo.common.fail';
/*
* 短信模板ID
*/
const SMS_VERIFY = 'common.sms_template.verify';
const SMS_DRIVER_REG = 'common.sms_template.driver_reg';
const SMS_LOGISTICS_CHECK_DRIVER = 'common.sms_template.logistics_company_check_driver';
const SMS_COMPANY_REG = 'common.sms_template.company_reg';
const SMS_FACTORY_CHECK_LOGISTICS = 'common.sms_template.factory_check_logistics_company';
const SMS_FACTORY_CHECK_DISTRIBUTOR = 'common.sms_template.factory_check_distributor_company';
public function funcName()
{
// function body here...
return view('admin.shiporder.shiporders', [
'title' => '运单管理',
'nowNav' => '运单列表',
'shiporders' => $shiporders,
'index' => 0,
'status' => $status,
]);
}
}
11.示例
wget https://evernote-1258366890.cos.ap-guangzhou.myqcloud.com/1910160812.php