所有的 JavaScript 項(xiàng)目適用同一種規(guī)范。
JavaScript 代碼規(guī)范
代碼規(guī)范通常包括以下幾個(gè)方面:
變量和函數(shù)的命名規(guī)則
空格,縮進(jìn),注釋的使用規(guī)則。
其他常用規(guī)范……
規(guī)范的代碼可以更易于閱讀與維護(hù)。
代碼規(guī)范一般在開(kāi)發(fā)前規(guī)定,可以跟你的團(tuán)隊(duì)成員來(lái)協(xié)商設(shè)置。
變量名
變量名推薦使用駝峰法來(lái)命名(camelCase):
firstName="John";
lastName="Doe";
price=19.90;
tax=0.20;
fullPrice=price + (price * tax);
空格與運(yùn)算符
通常運(yùn)算符 (=+ - * / ) 前后需要添加空格:
實(shí)例:
var x=y + z;
var values=["Volvo", "Saab", "Fiat"];
代碼縮進(jìn)
通常使用 4 個(gè)空格符號(hào)來(lái)縮進(jìn)代碼塊:
函數(shù):
function toCelsius(fahrenheit) {
return (5 / 9) * (fahrenheit - 32);
}
不推薦使用 TAB 鍵來(lái)縮進(jìn),因?yàn)椴煌庉嬈?TAB 鍵的解析不一樣。 |
語(yǔ)句規(guī)則
簡(jiǎn)單語(yǔ)句的通用規(guī)則:
一條語(yǔ)句通常以符號(hào)作為結(jié)束符。
實(shí)例:
var values=["Volvo", "Saab", "Fiat"];
var person={
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
復(fù)雜語(yǔ)句的通用規(guī)則:
將左花括號(hào)放在第一行的結(jié)尾。
左花括號(hào)前添加一空格。
將右花括號(hào)獨(dú)立放在一行。
不要以分號(hào)結(jié)束一個(gè)復(fù)雜的聲明。
函數(shù):
function toCelsius(fahrenheit) {
return (5 / 9) * (fahrenheit - 32);
}
循環(huán):
for (i=0; i < 5; i++) {
x +=i;
}
條件語(yǔ)句:
if (time < 20) {
greeting="Good day";
} else {
greeting="Good evening";
}
對(duì)象規(guī)則
對(duì)象定義的規(guī)則:
將左花括號(hào)與類名放在同一行。
冒號(hào)與屬性值間有個(gè)空格。
字符串使用雙引號(hào),數(shù)字不需要。
最后一個(gè)屬性-值對(duì)后面不要添加逗號(hào)。
將右花括號(hào)獨(dú)立放在一行,并以符號(hào)作為結(jié)束符號(hào)。
實(shí)例:
var person={
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
短的對(duì)象代碼可以直接寫(xiě)成一行:
實(shí)例:
var person={firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
每行代碼字符小于 80
為了便于閱讀每行字符建議小于數(shù) 80 個(gè)。
如果一個(gè) JavaScript 語(yǔ)句超過(guò)了 80 個(gè)字符,建議在 運(yùn)算符或者逗號(hào)后換行。
實(shí)例:
document.getElementById("demo").innerHTML=
"Hello Runoob.";
命名規(guī)則
一般很多代碼語(yǔ)言的命名規(guī)則都是類似的,例如:
變量和函數(shù)為駝峰法( camelCase)
全局變量為大寫(xiě) (UPPERCASE )
常量 (如 PI) 為大寫(xiě) (UPPERCASE )
變量命名你是否使用這幾種規(guī)則: hyp-hens, camelCase, 或 under_scores ?
HTML 和 CSS 的橫桿(-)字符:
HTML5 屬性可以以 data- (如:data-quantity, data-price) 作為前綴。
CSS 使用 - 來(lái)連接屬性名 (font-size)。
- 通常在 JavaScript 中被認(rèn)為是減法,所以不允許使用。 |
下劃線:
很多程序員比較喜歡使用下劃線(如:date_of_birth), 特別是在 SQL 數(shù)據(jù)庫(kù)中。
PHP 語(yǔ)言通常都使用下劃線。
帕斯卡拼寫(xiě)法(PascalCase):
帕斯卡拼寫(xiě)法(PascalCase) 在 C 語(yǔ)言中語(yǔ)言較多。
駝峰法:
JavaScript 中通常推薦使用駝峰法,jQuery 及其他 JavaScript 庫(kù)都使用駝峰法。
變量名不要以 $ 作為開(kāi)始標(biāo)記,會(huì)與很多 JavaScript 庫(kù)沖突。 |
HTML 載入外部 JavaScript 文件
使用簡(jiǎn)潔的格式載入 JavaScript 文件 ( type 屬性不是必須的):
<script src="myscript.js">
使用 JavaScript 訪問(wèn) HTML 元素
一個(gè)糟糕的 HTML 格式可能會(huì)導(dǎo)致 JavaScript 執(zhí)行錯(cuò)誤。
以下兩個(gè) JavaScript 語(yǔ)句會(huì)輸出不同結(jié)果:
實(shí)例
var obj=getElementById("Demo")
var obj=getElementById("demo")
HTML 與 JavaScript 盡量使用相同的命名規(guī)則。
訪問(wèn) HTML(5) 代碼規(guī)范。
文件擴(kuò)展名
HTML 文件后綴可以是 .html (或r .htm)。
CSS 文件后綴是 .css 。
JavaScript 文件后綴是 .js 。
使用小寫(xiě)文件名
大多 Web 服務(wù)器 (Apache, Unix) 對(duì)大小寫(xiě)敏感: london.jpg 不能通過(guò) London.jpg 訪問(wèn)。
其他 Web 服務(wù)器 (Microsoft, IIS) 對(duì)大小寫(xiě)不敏感: london.jpg 可以通過(guò) London.jpg 或 london.jpg 訪問(wèn)。
你必須保持統(tǒng)一的風(fēng)格,我們建議統(tǒng)一使用小寫(xiě)的文件名。
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
PSR是一套代碼編寫(xiě)規(guī)范,用于約束代碼風(fēng)格。以前沒(méi)有規(guī)范的時(shí)候大家都是按照自己的習(xí)慣來(lái)書(shū)寫(xiě)代碼,但每個(gè)人風(fēng)格不一樣,你的代碼在別人看來(lái)就是很不爽。而且會(huì)導(dǎo)致許多問(wèn)題:
function 函數(shù)名是否駝峰命名,
花括號(hào){}是否換行寫(xiě),
是該寫(xiě)注釋呢還是不寫(xiě)
變量名是大寫(xiě)還是小寫(xiě),
一個(gè)php文件中是一個(gè)類好還是允許有多個(gè)
所以PSR-[0-4]規(guī)范就應(yīng)運(yùn)而生,大家都共同遵守,就沒(méi)有風(fēng)格差異了。
PSR是由PHP-FIG這個(gè)組織發(fā)明的,F(xiàn)IG 是 Framework Interoperability Group(框架可互用性小組)的縮寫(xiě)。PSR是Proposing a Standards Recommendation(提出標(biāo)準(zhǔn)建議)的縮寫(xiě)。截止到目前為止,總共有5套PSR規(guī)范,分別是:
PSR-0 (Autoloading Standard) 自動(dòng)加載標(biāo)準(zhǔn)
PSR-1 (Basic Coding Standard) 基礎(chǔ)編碼標(biāo)準(zhǔn)
PSR-2 (Coding Style Guide) 編碼風(fēng)格向?qū)?
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自動(dòng)加載的增強(qiáng)版,可以替換掉PSR-0了。
PSR-0是第一套規(guī)范,主要用于規(guī)范自動(dòng)加載,不過(guò)現(xiàn)在已經(jīng)過(guò)時(shí)了,被PSR-4規(guī)范替代了。
PSR-0強(qiáng)制性要求幾點(diǎn):
1. 一個(gè)完全合格的namespace和class必須符合這樣的結(jié)構(gòu):“\< Vendor Name>(< Namespace>)*< Class Name>”
2. 每個(gè)namespace必須有一個(gè)頂層的namespace("Vendor Name"提供者名字)
3. 每個(gè)namespace可以有多個(gè)子namespace
4. 當(dāng)從文件系統(tǒng)中加載時(shí),每個(gè)namespace的分隔符(\)要轉(zhuǎn)換成 DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)
5. 在類名中,每個(gè)下劃線(_)符號(hào)要轉(zhuǎn)換成DIRECTORY_SEPARATOR(操作系統(tǒng)路徑分隔符)。在namespace中,下劃線(_)符號(hào)是沒(méi)有(特殊)意義的。
6. 當(dāng)從文件系統(tǒng)中載入時(shí),合格的namespace和class一定是以 .php 結(jié)尾的
7. verdor name,namespaces,class名可以由大小寫(xiě)字母組合而成(大小寫(xiě)敏感的)
假如我的文件路徑為Lib/Driver/Config.php,那么我的namespace的申明和使用為:
申明:namespace \Lib\Driver;
使用:use \Lib\Driver\Config;
namespace \Lib\Driver\Config->/path/to/vender/Lib/Driver/Config.php
Lib就是頂層namespace,Driver就是子namespace/
new \Lib\Driver\Config->轉(zhuǎn)換的目錄為/Lib/Driver/Config.php,替換反斜杠為目錄分隔符
\Lib\Driver\Class_Name->轉(zhuǎn)換為目錄為/Lib/Driver/Class/Name.php
\Lib\Package_Name\Class_Name->轉(zhuǎn)換為目錄為/Lib/Package_Name/Class/Name.php
目錄中的_就是下劃線,classname中的下劃線實(shí)際上會(huì)轉(zhuǎn)為成路徑分隔符。
加載的文件必須是.php結(jié)尾,既然使用php當(dāng)然是.php結(jié)尾了。不再像以前那樣有什么php3,php5
由于Liunx是區(qū)分大小寫(xiě)的,而windows是不區(qū)分大小寫(xiě)的,所以如果不注意大小寫(xiě)在win下正常開(kāi)發(fā),但是到了服務(wù)器上可能就無(wú)法正常執(zhí)行了。
要求:
1. PHP源文件必須只使用 <?php 和 <?=這兩種標(biāo)簽。
2. 源文件中php代碼的編碼格式必須是不帶字節(jié)順序標(biāo)記(BOM)的UTF-8。
3. 一個(gè)源文件建議只用來(lái)做聲明(類(class),函數(shù)(function),常量(constant)等)或者只用來(lái)做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時(shí)做這兩件事。
4. 命名空間(namespace)和類(class) 必須遵守PSR-0標(biāo)準(zhǔn)。
5. 類名(class name) 必須使用駱駝式(StudlyCaps)寫(xiě)法 (注:駝峰式(cameCase)的一種變種,后文將直接用StudlyCaps表示)。
6. 類(class)中的常量必須只由大寫(xiě)字母和下劃線(_)組成。
7. 方法名(method name) 必須使用駝峰式(cameCase)寫(xiě)法。
因?yàn)閜hp有4種標(biāo)簽形式,所以這里規(guī)定了使用哪一種,統(tǒng)一規(guī)范。
windows筆記本默認(rèn)是會(huì)在文件頭部加入BOM頭的,會(huì)導(dǎo)致在服務(wù)器上輸出得很奇怪。
國(guó)內(nèi)的中文編碼是GBK,UTF-8是國(guó)際通用編碼,不統(tǒng)一的話也會(huì)導(dǎo)致亂碼。
不要在一個(gè)文件中又是定義函數(shù)又是修改系統(tǒng)配置的,一個(gè)文件只做一件事。
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:載入了文件
include "file.php";
// 副作用:產(chǎn)生了輸出
echo "<html>\n";
// 聲明 function
function foo()
{
// 函數(shù)體
}
分開(kāi)寫(xiě)
// 聲明 function
function foo()
{
// 函數(shù)體
}
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:載入了文件
include "file.php";
這樣就很整齊。
參見(jiàn)PSR-0標(biāo)準(zhǔn)
類名必須使用駝峰命名,大駝峰小駝峰都可以。
<?php
class BigHouse{
}
<?php
class Test{
const USER_INFO='xx';
const NAME='xx';
}
<?php
class Test{
public function getUserInfo(){}
}
總結(jié):雖然規(guī)范里沒(méi)有規(guī)定使用大駝峰還是小駝峰,不過(guò)我的開(kāi)發(fā)習(xí)慣是class name大駝峰,method name小駝峰
PSR-2用于約束代碼風(fēng)格,代碼必須遵循PSR-1 中列出的所有規(guī)則。
代碼必須使用 4 個(gè)空格的縮進(jìn),并且不得使用制表符進(jìn)行縮進(jìn)。現(xiàn)代編輯器都可以設(shè)置。
注意:僅使用空格,而不是將空格與制表符混合使用,有助于避免差異、補(bǔ)丁、歷史記錄和注釋方面的問(wèn)題。空格的使用還可以輕松插入細(xì)粒度的子縮進(jìn)以進(jìn)行行間對(duì)齊。
<?php
namespace Vendor\Package;//下面必須空一行
use FooClass;//use放在namespace下面
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;//use下面也要空一行
// ... additional PHP code ...
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
//寫(xiě)在一行
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{//花括號(hào)換行寫(xiě)
// constants, properties, methods
}
implements有多個(gè)時(shí)可以寫(xiě)成多行,但要保證第一個(gè)必須在下一行。每行只能寫(xiě)一個(gè)接口,每行都要縮進(jìn)。
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,//第一個(gè)接口就要寫(xiě)在下一行,注意縮進(jìn)
\Countable,
\Serializable
{
// constants, properties, methods
}
<?php
namespace Vendor\Package;
class ClassName
{
public $foo=null;
}
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3=[])
{
// method body
}
}
參數(shù)列表可以分成多行,和接口多行一樣需要縮進(jìn)。參數(shù)多行時(shí)做花括號(hào)不用換行寫(xiě),但是要在右括號(hào)后空一格。如下:
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3=[]
) {
// method body
}
}
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo; //static修飾符放到可見(jiàn)性聲明后面
abstract protected function zim();//abstract 放到前面
final public static function bar()//final放到前面
{
// method body
}
}
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
elseif應(yīng)該連著寫(xiě) 不要寫(xiě)成else if,要看著像一個(gè)單詞。
<?php
switch ($expr) {//括號(hào)前后都要有空格
case 0:
echo 'First case, with a break';
break;//break要和上一行對(duì)齊
case 1:
echo 'Second case, which falls through';
//沒(méi)有break語(yǔ)句的要寫(xiě)注釋no break
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
<?php
while ($expr) {
// structure body
}
do {
// structure body;
} while ($expr);
<?php
for ($i=0; $i < 10; $i++) {
// for body
}
foreach ($iterable as $key=> $value) {
// foreach body
}
<?php
try {
// try body
} catch (FirstExceptionType $e) {
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
<?php
$closureWithArgs=function ($arg1, $arg2) {
// body
};
$closureWithArgsAndVars=function ($arg1, $arg2) use ($var1, $var2) {
// body
};
//參數(shù)列表格式化
$longArgs_noVars=function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// body
};
$noArgs_longVars=function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_longVars=function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_shortVars=function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
$shortArgs_longVars=function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
//閉包作為參數(shù)傳入
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// body
},
$arg3
);
PSR-3規(guī)范是日志庫(kù)的通用接口,一般框架都幫我們做好了,了解即可。官網(wǎng)文檔
PSR-4也是自動(dòng)加載規(guī)范,用來(lái)取代PSR-0的。
psr-0,psr-4是自動(dòng)加載規(guī)范,psr-1,psr-2是代碼風(fēng)格規(guī)范,psr-3是日志庫(kù)接口。
平常工作中盡量使用psr-1,psr-2規(guī)范來(lái)規(guī)范我們的代碼風(fēng)格。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。