基本要求
- 以标准计算机英文为蓝本,杜绝一切拼音、或拼音英文混杂的命名方式
- 纯PHP代码源文件只使用 <?php 标签,省略关闭标签 ?>
- 源文件中PHP代码的编码格式必须是无BOM的UTF-8格式
- 一个源文件只做一种类型的声明,即这个文件专门用来声明Class,那个文件专门用来设置配置信息,别混在一起写
- 使用Tab键来缩进,每个Tab键长度设置为4个空格
- 一行推荐的是最多写120个字符,多于这个字符就应该换行了
- 关键字必须小写,boolean值:true,false,null 也必须小写
- 涉及到多个数据表 更新/添加 操作时,最外层要用事务,保证数据库操作的原子性
- Model层,只做简单的数据表的查询
- 业务逻辑统一封装到 Logic层
- 控制器只做URL路由,不要当作 业务方法 调用,不能出现SQL操作语句
命名规范
- 变量命名,采用驼峰式写法,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写.例:$orderList
- 数组变量命名,采用驼峰式写法,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写.例:$userArray
- 全局变量命名,带前缀 ‘g’,采用驼峰式写法,使用大写字母作为词的分隔,其他的字母均使用小写,标明一个变量的作用域.例:global $gLog;
- 全局常量命名,所有字母都使用大写,以下划线 ‘_’ 分隔每个单词.例:define(‘WEB_NAME’, ‘博客’);
- 静态变量命名,带前缀 ‘s’,采用驼峰式写法,使用大写字母作为词的分隔,其他的字母均使用小写.例:function test() {static $sStatus = 0;}
- 函数命名,使用小写字母、下划线组合.例:function get_client_ip () {}
- 类文件命名,类的文件名与类的名字保持一致,包括大小写,以 “ .class.php”作为文件的后缀.例:User 类保存的文件名称是 User.class.php,UserAccount 类保存的文件名称是 UserAccount.class.php
- 类的命名,采用驼峰式写法,以大写字母作为词的分隔,其他的字母均使用小写,名词的首个字母使用大写,不使用下划线.例:class User {}, class UserAccount {}
- 类属性命名,以字符 ‘m’ 为前缀,采用驼峰式写法,以大写字母作为词的分隔,其他的字母均使用小写.例:public $mUserName; (习惯了 public $userName; 通常下划线开头的属性为私有属性 private $_userName;)
- 类方法命名,采用驼峰法,即以大写字母作为词的分隔,其他的字母均使用小写.例:public function checkEmail () {} (通常下划线开头的方法为私有方法 private function _checkEmail () {})
- 类方法参数命名,采用驼峰式写法,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写.例:public function checkPwd ($oldPwd, $newPwd) {}
- 类的实例对象的命名(对象变量命名),以下划线开头,采用驼峰式写法,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首个字母使用小写.例:$_user = new User(); $_userAccount = new UserAccount(); 也可以使用 $user_obj = new User(); $user_account_obj = new UserAccount();
- 引用变量,以字符 ‘r’ 为前缀.例:function get_tree (&$rData) {}
- 所有命名可以组合使用.例:class User { public static $msUserName;} 既是类属性又是静态变量
- 模板文件名命名,所有字母都使用小写,使用 ‘_’ 作为每个词的分界.例:user_list.html
- 文件名的命名,所有字母都使用小写,使用 ‘_’ 作为每个词的分界.例:user_list.php
- 数据库命名,表名所有字母都使用小写,使用 ‘_’ 作为每个词的分界,数据字段命名也与数据表命名相同.例: ms_user,ms_user_info
代码样式风格
命名空间(Namespace) 和 导入(Use)声明
- 命名空间(namespace)的声明后面必须有一行空行
- 所有的导入(use)声明必须放在命名空间(namespace)声明的下面
- 一句声明中,必须只有一个导入(use)关键字
- 在导入(use)声明代码块后面必须有一行空行
1
2
3
4
5
6
7
8
namespace Lib\Databases; // 下面必须空一行
use FooInterface; // use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; // 下面必须空一行
class MySQL {}类(class),属性(property)和方法(method)
- 继承(extends) 和实现(implement) 必须和 class name 写在一行
- 属性(property),必须声明其可见性,到底是 public 还是 protected 还是 private,不能省略,也不能使用var,var是php老版本中的什么方式,等用于public
- 方法(method),必须 声明其可见性,到底是 public 还是 protected 还是 private,不能省略;如果有多个参数,第一个参数后紧接 “,”,再加一个空格:function_name ($par, $par2, $pa3), 如果参数有默认值, “=” 左右各有一个空格分开
- 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private) 的前面;当用到静态(static)来做类声明时,则必须放在可见性声明的后面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace Lib\Databaes;
class MySQL extends ParentClass implements \PDO, \DB // 写一行
{
public $foo = null;
private $name = 'yangyi';
protected $age = '17';
public getInfo($name, $age, $gender = 1) // 参数之间有一个空格,默认参数的"="左右各有一个空格
{
}
}
abstract class ClassName
{
protected static $foo; // static放后面
abstract protected function zim(); // abstract放前面
final public static function bar() // final放前面,static放最后
{
}
}控制结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
if ($expr1) { // if 与 ( 之间有一个空格, ) 与 { 之间有一个空格
} elseif ($expr2) { // elesif 连着写,与 ( 之间有一个空格, ) 与 { 之间有一个空格
} else { // else 左右各一个空格
}
switch ($expr) { // switch 与 ( 之间有一个空格, ) 与 { 之间有一个空格
case 0:
echo 'First case, with a break'; // 对齐
break; // 换行写break,也对齐
case 1:
case 2:
case 3:
case 4:
echo 'return instead of break';
return;
default:
echo 'Default case';
break;
}
while ($expr) { // while 与 ( 之间有一个空格, ) 与 { 之间有一个空格
}
do { // do 与 { 之间有一个空格
} while ($expr); // while 左右各有一个空格
for ($i = 0; $i < 10; $i++) { // for 与 ( 之间有一个空格, 二元操作符 "="、"<" 左右各有一个空格, ) 与 { 之间有一个空格
}
foreach ($iterable as $key => $value) { // foreach 与 ( 之间有一个空格, "=>" 左右各有一个空格, ) 与 { 之间有一个空格
}
try { // try 右边有一个空格
} catch (FirstExceptionType $e) { // catch 与 ( 之间有一个空格, ) 与 { 之间有一个空格
} catch (OtherExceptionType $e) { // catch 与 ( 之间有一个空格, ) 与 { 之间有一个空格
}注释
- 行注释 // 后面需要加一个空格,如果 // 前面有非空字符,则 // 前面需要加一个空格
- 函数注释,参数名、属性名、标签的文本 上下要对齐,在第一个标签前加一个空行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* This is a sample function to illustrate additional PHP
* formatter options.
*
* @param $one The first parameter
* @param int $two The second parameter
* @param string $three The third parameter with a longer
* comment to illustrate wrapping.
* @return void
* @author phpgo.cnblogs.com
* @license GPL
*/
function foo($one, $two = 0, $three = "String")
{
}空格
- 赋值操作符(=,+= 等)、逻辑操作符(&&,||)、等号操作符(==,!=)、关系运算符(<,>,<=,>=)、按位操作符(&,|,^)、连接符(.) 左右各有一个空格
- if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等 与 紧挨的左括号”(“之间有一个空格
- 函数、方法的各个参数之间,逗号(“,”)后面有一个空格
空行
- 所有左花括号 { 都不换行,并且 { 紧挨着的下方,一定不是空行
- 同级代码(缩进相同)的 注释(行注释/块注释)前面,必须有一个空行
- 各个方法/函数 之间有一个空行
- namespace语句、use语句、clase语句 之间有一个空行
- return语句,如果 return 语句之前只有一行PHP代码,return 语句之前不需要空行; 如果 return 语句之前有至少二行PHP代码,return 语句之前加一个空行
- if,while,switch,for,foreach,try 等代码块之间 以及 与其他代码之间有一个空行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63/**
* 获得用户统计信息
*
* @param int $userId 用户ID
* @return array
*/
public function getUserCard($userId)
{
$userId = intval($userId);
return UserMainLogic::instance()->getUserCard($userId);
}
/**
* 根据Id 获取用户信息
*
* @param int $userId 用户Id
* @param string $field 显示字段
* @return array
*/
public function getByUserId($userId = 0, $field = '*')
{
if (empty($userId)) {
return [];
}
$where = ['id' => $userId];
$info = $this->field($field)->where($where)->find();
if (isset($info['image']) && isset($info['sex'])) {
$info['image'] = ImageHelper::GetImageUrl($info['image'], $info['sex']);
}
return $info;
}
$serv = new swoole_server("127.0.0.1", 9502);
// sets server configuration, we set task_worker_num config greater than 0 to enable task workers support
$serv->set(['task_worker_num' => 4]);
// attach handler for receive event, which have explained above.
$serv->on('receive', function($serv, $fd, $from_id, $data) {
// we dispath a task to task workers by invoke the task() method of $serv
// this method returns a task id as the identity of ths task
$task_id = $serv->task($data);
echo "Dispath AsyncTask: id=$task_id\n";
});
// attach handler for task event, the handler will be executed in task workers.
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
// handle the task, do what you want with $data
echo "New AsyncTask[id=$task_id]".PHP_EOL;
// after the task task is handled, we return the results to caller worker.
$serv->finish("$data -> OK");
});
// attach handler for finish event, the handler will be executed in server workers, the same worker dispatched this task before.
$serv->on('finish', function ($serv, $task_id, $data) {
echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
$serv->start();数组的书写格式
只有一个键值对时,就写成一行:
1
$where = ['id' => 789];
有多个(二个或二个以上)键值对时,就换行:
1
2
3
4$where = [
'id' => 789,
'user_name' => 'phpgo'
];