## 文件格式
- #### PHP標簽
> 關閉PHP標簽僅包含PHP代碼的文件應始終省略關閉的PHP標記(?>)。否則可能導致白屏。
- #### 縮進
> 所有縮進為tab而非空格。當需要適當補全時,才可使用空格處理。
```php
// indented 2 tabs
$var = 'something'; // indented with tabs and aligned value & comments
$variable = 'else'; // with those above/below using spaces
```
- #### 回車
> 采用unix的換行格式。「Unix-style LF」
- #### 命名文件
> 所有文件名,以小寫命名。
- #### 編碼方式
> utf-8,with NO BOM。
### 命名約定
- #### 命名空間
> 所有核心類必須在Fuel \ Core命名空間下。
```PHP
namespace Fuel\Core;
```
- #### 類
> 類名應使用下劃線分隔單詞,并且類名中的每個單詞均應以大寫字母開頭。下劃線將在自動加載期間轉換為目錄分隔符。
>
> **原則上不使用駝峰命名**。
```php
namespace Fuel\Core;
class Session
{
}
```
``` php
namespace Fuel\Core;
class Session_Cookie extends Session_Driver
{
}
```
<!-- 如果按以上命名,將訪問以下文件路徑 -->
``` php
core/classes/session.php
core/classes/session/cookie.php
```
- 方法
> 與類名一樣,方法名應使用下劃線分隔單詞,而不是駝峰。方法名稱也應該全部小寫。始終應包括可見性( public, protected, private )。
- #### 變量
- 變量名稱應簡潔明了,并且僅包含小寫字母和下劃線。循環迭代器應較短,最好是單個字符。
``` php
$first_name
$buffer
for ($i = 0; $i < $max; $i++)
```
- #### 常量
> 變量名稱應簡潔明了,并且僅包含小寫字母和下劃線。循環迭代器應較短,最好是單個字符。
``` php
MY_CONSTANT
TEMPLATE_PATH
TEXT_DEFAULT
```
不建議使用全局常量,并且應將其絕對降至最低。在可能的情況下,使用類常量來明確其范圍,用法和含義。
### 關鍵詞
> 關鍵字,例如 `true`,`false`,`null`,`as` 等,應該都是小寫的,因為大寫是為常量保留的,變量類型
也應當小寫,比如 `array`,`integer`,`string`
### 強制類型轉換
> 不建議使用類型轉換。PHP是一種弱類型語言,有時類型轉換規則非常模糊。它們可能會導致意外的行為,從而可能會導致很難發現錯誤。而是在轉換之前進行內容檢查,以確保變量包含期望值。
### 控制結構
結構的關鍵字,如if,for,foreach,while,switch應當后跟一個空格。花括號應放在新行上,并break具有與大小寫相同的選項卡。break與case 同級。
~~~
if ($arg === true)
{
//do something here
}
elseif ($arg === null)
{
//do something else here
}
else
{
//catch all do something here
}
foreach ($array as $key => $value)
{
//loop here
}
for ($i = 0; $i < $max; $i++)
{
//loop here
}
while ($i < $max)
{
//loop here
}
do
{
//loop here
}
while ($i < $max)
switch ($var)
{
case 'value1':
//do something here
break;
default :
//do something here
break;
}
~~~
##### 替代if語句
> 在某些情況下,使用完成的 `if` 語句使代碼變得太長。建議使用三目運算,來完成需要的判斷。
~~~
// instead of if (isset($var)) { Config::set('var', $var); }
isset($var) and Config::set('var', $var);
// instead of if ( ! isset($var)) { $var = Config::get('var'); }
isset($var) or $var = Config::get('var');
// DON'T DO THIS
Uri::segment(3) and $var = Uri::segment(3);
Uri::segment(3) or $var = 'default';
// This is better:
if (Uri::segment(3))
{
$var = Uri::segment(3);
}
else
{
$var = 'default';
}
// Or this:
$var = Uri::segment(3) ? Uri::segment(3) : 'default';
// Or even better, this:
$var = Uri::segment(3) ?: 'default';
~~~
### 比較,邏輯運算符
> 比較函數/方法的返回值和變量,應該了解比較兩邊的數據類型。在比較返回值時
應,盡量使用對類型敏感的絕對等于或絕對不等于,使用`and`和`or`,替換` &`和`||` 來提高代碼可讀性。在`!`使用時,應在左右都留有空格。
~~~
if ($var == false and $other_var != 'some_value')
if ($var === false or my_function() !== false)
if ( ! $var)
~~~
#### 類/接口聲明
> 類/接口聲明在以下行中有左括號:
~~~
class Session
{
}
~~~
> 如果類為空,則大括號將與定義位于同一行:
~~~
class Empty_Class { }
~~~
#### 功能/方法/關閉聲明
> 功能/方法/閉合開口支架必須始終從新行開始,并具有與其結構相同的縮進。
~~~
class Session
{
public static function get_flash($name, $data)
{
$closure = function($a, $b)
{
// Your closure code here
}
}
}
~~~
#### 變量
> 初始化變量時,每行應聲明一個變量。為了提高代碼的可讀性,它們應分別放在單獨的行上。適當的對齊值和注釋。
~~~
$var = ''; // do each on its own line
$other_var = ''; // do each on its own line
~~~
#### 括號和括號
> 初始括號/括號之前或之后不得有空格。合上括號/括號之前不能有空格。
~~~
$array = array(1, 2, 3, 4);
$array['my_index'] = 'something';
for ($i = 0; $i < $max; $i++)
~~~
#### 字符串引號
> 單引號優于雙引號。它可以防止變量和控制字符的意外或意外擴展。
#### 級聯
> 字符串串聯不應在連接的部分周圍包含空格。
~~~
//yes
$string = 'my string '.$var.' the rest of my string';
//no
$string = 'my string ' . $var . ' the rest of my string';
~~~
#### 運算符
~~~
$var = 'something';
if ($var == 'something') //space before and after logical operator
$var = $some_var + $other_var; //space before and after math operator
$var++; // no space before increment
++$var; //no space after increment
~~~
##### 數組點符號
盡管嚴格地說,它不是編碼標準,但是在框架類和本文檔中已使用了很多,并且由于它不是通用的PHP表示法,因此可能會使剛接觸框架的人感到困惑。
~~~
// when you see "always_load.packages = array()", it is shorthand for:
array("always_load" => array("packages" => array(...) ) );
~~~
Arr類以及Lang,Config和Session類使用此表示法來快速訪問多維數組中的各個元素。
~~~
// when you have an array structure like this
$array = array(
"always_load" => array(
"packages" => array(
"orm",
"package" => "/my/special/package.php",
)
)
);
// then this will return "/my/special/package.php":
$path = Arr::get($array, 'always_load.packages.package');
~~~