PHP編碼規(guī)范

一赘淮、基本約定

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 (par,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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猜憎,一起剝皮案震驚了整個(gè)濱河市娩怎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胰柑,老刑警劉巖截亦,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柬讨,居然都是意外死亡崩瓤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門踩官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却桶,“玉大人,你說我怎么就攤上這事∮毕担” “怎么了嗅剖?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嘁扼。 經(jīng)常有香客問我信粮,道長(zhǎng),這世上最難降的妖魔是什么趁啸? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任强缘,我火速辦了婚禮,結(jié)果婚禮上不傅,老公的妹妹穿的比我還像新娘旅掂。我一直安慰自己,他們只是感情好蛤签,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布辞友。 她就那樣靜靜地躺著,像睡著了一般震肮。 火紅的嫁衣襯著肌膚如雪称龙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天戳晌,我揣著相機(jī)與錄音鲫尊,去河邊找鬼。 笑死沦偎,一個(gè)胖子當(dāng)著我的面吹牛疫向,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豪嚎,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼搔驼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了侈询?” 一聲冷哼從身側(cè)響起舌涨,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扔字,沒想到半個(gè)月后囊嘉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡革为,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年扭粱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震檩。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琢蛤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虐块,我是刑警寧澤俩滥,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站贺奠,受9級(jí)特大地震影響霜旧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儡率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一挂据、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儿普,春花似錦崎逃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浪汪,卻和暖如春巴柿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背死遭。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工广恢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呀潭。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓钉迷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钠署。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糠聪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351