一赘淮、基本約定
1辕录、源文件
(1)、純PHP代碼源文件只使用 <?php 標(biāo)簽梢卸,省略關(guān)閉標(biāo)簽 ?> 走诞;
(2)、源文件中PHP代碼的編碼格式必須是無BOM的UTF-8格式蛤高;
(3)蚣旱、使用 Unix LF(換行符)作為行結(jié)束符;
(4)戴陡、一個(gè)源文件只做一種類型的聲明塞绿,即,這個(gè)文件專門用來聲明Class, 那個(gè)文件專門用來設(shè)置配置信息猜欺,別混在一起寫位隶;
2、縮進(jìn)
使用Tab鍵來縮進(jìn)开皿,每個(gè)Tab鍵長(zhǎng)度設(shè)置為4個(gè)空格涧黄;
3、行
一行推薦的是最多寫120個(gè)字符赋荆,多于這個(gè)字符就應(yīng)該換行了笋妥,一般的編輯器是可以設(shè)置的。
4窄潭、關(guān)鍵字 和 True/False/Null
PHP的關(guān)鍵字春宣,必須小寫,boolean值:true嫉你,false月帝,null 也必須小寫。下面是PHP的“關(guān)鍵字”幽污,必須小寫:
5嚷辅、命名
(1)、類名 使用大駝峰式(StudlyCaps)寫法距误;
(2)簸搞、(類的)方法名 使用小駝峰(cameCase)寫法扁位;
(3)、函數(shù)名使用 小寫字母 + 下劃線 寫法趁俊,如 function http_send_post()域仇;
(4)、變量名 使用小駝峰寫法寺擂,如 $userName暇务;
6、代碼注釋標(biāo)簽
如 函數(shù)注釋沽讹、變量注釋等般卑,常用標(biāo)簽有 [@package](https://phpdoc.org/docs/latest/references/phpdoc/tags/package.html)、[@var](https://phpdoc.org/docs/latest/references/phpdoc/tags/var.html)爽雄、[@param](https://phpdoc.org/docs/latest/references/phpdoc/tags/param.html)、[@return](https://phpdoc.org/docs/latest/references/phpdoc/tags/return.html)沐鼠、[@author](https://phpdoc.org/docs/latest/references/phpdoc/tags/author.html)挚瘟、[@todo](https://phpdoc.org/docs/latest/references/phpdoc/tags/todo.html)、[@throws](https://phpdoc.org/docs/latest/references/phpdoc/tags/throws.html) 必須遵守 phpDocument 標(biāo)簽規(guī)則饲梭,不要另外去創(chuàng)造新的標(biāo)簽乘盖,更多標(biāo)簽查看 [phpDocument官網(wǎng)](https://phpdoc.org/docs/latest/references/phpdoc/tags/param.html)
7、業(yè)務(wù)模塊
(1)憔涉、涉及到多個(gè)數(shù)據(jù)表 更新/添加 操作時(shí)订框,最外層要用事務(wù),保證數(shù)據(jù)庫(kù)操作的原子性兜叨;
(2)穿扳、Model層,只做簡(jiǎn)單的數(shù)據(jù)表的查詢国旷;
(3)矛物、業(yè)務(wù)邏輯統(tǒng)一封裝到 Logic層;
(4)跪但、控制器只做URL路由履羞,不要當(dāng)作 業(yè)務(wù)方法 調(diào)用;
(5)屡久、控制器層不能出現(xiàn)SQL操作語句忆首,如 ThinkPHP框架的 where()、order() 等模型方法被环,即糙及,控制器中,不要出現(xiàn)類似這樣的SQL語句:D('XXX')->where()->order()->limit()->find(); where()蛤售、order()丁鹉、limit() 等SQL方法只能出現(xiàn)在 Model層妒潭、業(yè)務(wù)層!
二揣钦、代碼樣式風(fēng)格
1雳灾、命名空間(Namespace) 和 導(dǎo)入(Use)聲明
先簡(jiǎn)單文字描述下:
命名空間(namespace)的聲明后面必須有一行空行;所有的導(dǎo)入(use)聲明必須放在命名空間(namespace)聲明的下面冯凹;一句聲明中谎亩,必須只有一個(gè)導(dǎo)入(use)關(guān)鍵字;在導(dǎo)入(use)聲明代碼塊后面必須有一行空行宇姚;
用代碼來說明下:
<?php namespace Lib\Databases;
class Mysql {
}?>
namespace下空一行匈庭,才能使用use,再空一行浑劳,才能聲明class
<?php
namespace Lib\Databases;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Mysql {
}?>
2阱持、類(class),屬性(property)和方法(method)
(1)魔熏、繼承(extends) 和實(shí)現(xiàn)(implement) 必須和 class name 寫在一行衷咽。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
}
(2)、屬性(property)必須聲明其可見性蒜绽,到底是 public 還是 protected 還是 private镶骗,不能省略,也不能使用var, var是php老版本中的什么方式躲雅,等用于public鼎姊。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
public $foo = null;
private $name = 'yangyi';
protected $age = '17';
}
(3)、方法(method)相赁,必須 聲明其可見性相寇,到底是 public 還是 protected 還是 private,不能省略噪生。如果有多個(gè)參數(shù)裆赵,第一個(gè)參數(shù)后緊接“,” ,再加一個(gè)空格:function_name (par2, $pa3), 如果參數(shù)有默認(rèn)值跺嗽,“=”左右各有一個(gè)空格分開战授。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
public getInfo($name, $age, $gender = 1) { // 參數(shù)之間有一個(gè)空格。默認(rèn)參數(shù)的“=”左右各有一個(gè)空格桨嫁,) 與 { 之間有一個(gè)空格
}
}
(4)植兰、當(dāng)用到抽象(abstract)和終結(jié)(final)來做類聲明時(shí),它們必須放在可見性聲明 (public 還是protected還是private)的前面璃吧。而當(dāng)用到靜態(tài)(static)來做類聲明時(shí)楣导,則必須放在可見性聲明的后面。
<?php
namespace Vendor\Package;
abstract class ClassName {
protected static $foo; // static放后面
abstract protected function zim(); // abstract放前面
final public static function bar() { // final放前面畜挨,static放最后筒繁。
// 方法主體部分
}
}
3噩凹、控制結(jié)構(gòu)
控制接口,就是 if else while switch等毡咏。這一類的寫法規(guī)范也是經(jīng)常容易出現(xiàn)問題的驮宴,也要規(guī)范一下。
(1)呕缭、if堵泽,elseif,else寫法恢总,直接上規(guī)范代碼吧:
<?php
if ($expr1) { // if 與 ( 之間有一個(gè)空格迎罗,) 與 { 之間有一個(gè)空格
} elseif ($expr2) { // elesif 連著寫,與 ( 之間有一個(gè)空格片仿,) 與 { 之間有一個(gè)空格
} else { // else 左右各一個(gè)空格
}
(2)纹安、switch,case 注意空格和換行滋戳,還是直接上規(guī)范代碼:
<?php
switch ($expr) { // switch 與 ( 之間有一個(gè)空格钻蔑,) 與 { 之間有一個(gè)空格
case 0:
echo 'First case, with a break'; // 對(duì)齊
break; // 換行寫break,也對(duì)齊奸鸯。
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
(3)、while可帽,do while 的寫法也是類似娄涩,上代碼:
<?php
while ($expr) { // while 與 ( 之間有一個(gè)空格, ) 與 { 之間有一個(gè)空格
}
do { // do 與 { 之間有一個(gè)空格
} while ($expr); // while 左右各有一個(gè)空格
(4)映跟、for的寫法
<?php
for ($i = 0; $i < 10; $i++) { // for 與 ( 之間有一個(gè)空格蓄拣,二元操作符 "="、"<" 左右各有一個(gè)空格努隙,) 與 { 之間有一個(gè)空格
}
(5)球恤、foreach的寫法
<?php
foreach ($iterable as $key => $value) { // foreach 與 ( 之間有一個(gè)空格,"=>" 左右各有一個(gè)空格荸镊,) 與 { 之間有一個(gè)空格
}
(6)咽斧、try catch的寫法
<?php
try { // try 右邊有一個(gè)空格
} catch (FirstExceptionType $e) { // catch 與 ( 之間有一個(gè)空格,) 與 { 之間有一個(gè)空格
} catch (OtherExceptionType $e) { // catch 與 ( 之間有一個(gè)空格躬存,) 與 { 之間有一個(gè)空格
}
4张惹、注釋
(1)、行注釋
// 后面需要加一個(gè)空格岭洲;
如果 // 前面有非空字符宛逗,則 // 前面需要加一個(gè)空格;
(2)盾剩、函數(shù)注釋
參數(shù)名雷激、屬性名替蔬、標(biāo)簽的文本 上下要對(duì)齊;
在第一個(gè)標(biāo)簽前加一個(gè)空行屎暇;
<?php
/**
* 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 52php.cnblogs.com
* @license GPL
*/
function foo($one, $two = 0, $three = "String") {
}
5承桥、空格
(1)、賦值操作符(=恭垦,+= 等)快毛、邏輯操作符(&&,||)番挺、等號(hào)操作符(==唠帝,!=)、關(guān)系運(yùn)算符(<玄柏,>襟衰,<=,>=)粪摘、按位操作符(&瀑晒,|,^)徘意、連接符(.) 左右各有一個(gè)空格苔悦;
(2)、if椎咧,else玖详,elseif,while勤讽,do蟋座,switch,for脚牍,foreach向臀,try,catch诸狭,finally 等 與 緊挨的左括號(hào)“(”之間有一個(gè)空格券膀;
(3)、函數(shù)作谚、方法的各個(gè)參數(shù)之間三娩,逗號(hào)(",")后面有一個(gè)空格;
6妹懒、空行
(1)雀监、所有左花括號(hào) { 都不換行,并且 { 緊挨著的下方,一定不是空行会前;
(2)好乐、同級(jí)代碼(縮進(jìn)相同)的 注釋(行注釋/塊注釋)前面,必須有一個(gè)空行瓦宜;
(3)蔚万、各個(gè)方法/函數(shù) 之間有一個(gè)空行;
(4)临庇、namespace語句反璃、use語句、clase語句 之間有一個(gè)空行假夺;
(5)淮蜈、return語句
如果 return 語句之前只有一行PHP代碼,return 語句之前不需要空行已卷;
如果 return 語句之前有至少二行PHP代碼梧田,return 語句之前加一個(gè)空行;
(5)侧蘸、if裁眯,while,switch讳癌,for穿稳,foreach、try 等代碼塊之間 以及 與其他代碼之間有一個(gè)空行晌坤;
【參考示例 匯總】
參考1:
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
public getInfo($name, $age, $gender = 1) { // 參數(shù)之間有一個(gè)空格司草。默認(rèn)參數(shù)的“=”左右各有一個(gè)空格,) 與 { 之間有一個(gè)空格
}
}
參考2:
<?php
namespace Vendor\Package;
abstract class ClassName {
protected static $foo; // static放后面
abstract protected function zim(); // abstract放前面
final public static function bar() { // final放前面泡仗,static放最后。
// 方法主體部分
}
}
參考3:
<?php
namespace library\Model;
use library\Helper\ImageHelper;
use library\Logic\UserMainLogic;
/**
* 用戶表 數(shù)據(jù)模型
*
* @package library\Model
*/
class UserMainModel extends BasicModel {
/**
* 獲得用戶統(tǒng)計(jì)信息
*
* @param int $userId 用戶ID
* @return array
*/
public function getUserCard($userId) {
$userId = intval($userId);
return UserMainLogic::instance()->getUserCard($userId);
}
/**
* 根據(jù)Id 獲取用戶信息
*
* @param int $userId 用戶Id
* @param string $field 顯示字段
* @return array
*/
public function getByUserId($userId = 0, $field = '*') {
if (empty($userId)) {
return array();
}
$where = array('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;
}
}
參考4:
$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(array('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();