编码标准
这些程式码格式與文件的标准,必須被任何對 Fuel 贡献的人遵循, 任何不符合这些准則的贡献将不被接受。
档案格式
PHP 結束标籤
只包含 PHP 程式码的文件應該總是省略 PHP 結束标籤(?>)。 这可以防止許多難以捉摸的死亡白螢幕。
縮排
所有縮排應該使用真正的 Tab,而非空格。
但對齊縮排後的物件應該使用空格,而非 Tab。
// 縮排 2 个 Tab
$var = 'something'; // 用 Tab 縮排并在值和註解
$variable = 'else'; // 前/後使用空格對齊
行結尾
行結尾應为 Unix-style LF。
档案命名
所有档案名稱必須全小寫,沒有例外。
编码
档案應以 UTF-8 编码儲存且不應該使用 BOM。
命名慣例
命名空間
所有核心类別必須在 Fuel\Core 命名空間底下。
namespace Fuel\Core;
类別
类別名稱應該使用底線來分隔单詞,而且类別名稱的每个单詞應以大寫字母開始。 然而,在自动載入期間,底線会被轉換成目录分隔。 駝峰式的使用是被勸阻的,但在某些情況下不能防止, 當放置类別在一个子目录時是沒有意義的。
namespace Fuel\Core;
class Session
{
}
namespace Fuel\Core;
class Session_Cookie extends Session_Driver
{
}
这将会是下列档案路徑:
core/classes/session.php
core/classes/session/cookie.php
方法
如同类別名稱,方法名稱應該使用底線來分隔单詞,而非駝峰式。
方法名稱也應該全部小寫,可見性應始終包括在(public、protected、private)。
底線可以被用在名稱的開頭,以明白表示方法是保護/私有,
或當你需要方法是公共時,表示它應該被这樣認爲。
class Session
{
public static function get_flash($name, $data)
{
// 一些程式码
}
}
class View
{
// 全域的檢視資料陣列
protected static $_global_data = array();
protected static function capture($view_filename, array $view_data)
{
// 一些程式码
}
}
變数
變数名稱應該要简潔并只有小寫字母和底線。循环迭代應該是短的, 最好是单一字元。
$first_name
$buffer
for ($i = 0; $i < $max; $i++)
常数
常数遵循相同的准則如同變数,例外的是, 常数應該是全部大寫的。
MY_CONSTANT
TEMPLATE_PATH
TEXT_DEFAULT
關鍵字
如 true、false、null、as 等關鍵字應該全部小寫, 因为大寫保留給常数。同樣適用於原始类型,如 array、integer、string。
$var = true;
$var = false;
$var = null;
foreach ($array as $key => $value)
public function my_function(array $array)
function my_function($arg = null)
控制結構
結構關鍵字例如 if、for、foreach、while、switch 應該在一个空格後面加參数/變数列表和值。 大括號應該被放在新的一行,并且 break 在它的情況也應該有相同的标籤。
if ($arg === true)
{
// 做點什么
}
elseif ($arg === null)
{
// 做些其他事情
}
else
{
// 捕捉所有的做點什么
}
foreach ($array as $key => $value)
{
// 迴圈
}
for ($i = 0; $i < $max; $i++)
{
// 迴圈
}
while ($i < $max)
{
// 迴圈
}
do
{
// 迴圈
}
while ($i < $max)
switch ($var)
{
case 'value1':
// 做點什么
break;
default :
// 做點什么
break;
}
替代的 if 語句
在某些情況下,简单的條件分配或函式呼叫用一个完整的 if 語句的程式码有點過多,
你可以使用 PHP 的执行邏輯來使用較短的布林運算子基础句法。
使用 and 意指第二部份只在第一部份为 true 時獲得計算。
使用 or 意指第二部份只在第一部份为 false 時獲得执行。
當 if 和 else 兩者都需要時不要使用,只在单一條件語句的情況下使用。
// 代替 if (isset($var)) { Config::set('var', $var); }
isset($var) and Config::set('var', $var);
// 代替 if ( ! isset($var)) { $var = Config::get('var'); }
isset($var) or $var = Config::get('var');
// 千萬不要这樣做
Uri::segment(3) and $var = Uri::segment(3);
Uri::segment(3) or $var = 'default';
// 这樣比較好:
if (Uri::segment(3))
{
$var = Uri::segment(3);
}
else
{
$var = 'default';
}
// 或这樣:
$var = Uri::segment(3) ? Uri::segment(3) : 'default';
// 或實際上是这樣:
$var = Uri::segment(3) ?: 'default';
比較、邏輯運算子
函式/方法比較回傳和變数應該是已知的类型,例如一些函式可能回傳 false, 且當此比較回傳类型敏感的運算子如 === 或 !==。 此外,使用 and 或 or 比 && 或 || 來得有可讀性。在某些情況下, 如其所需也許会不可避免的使用 && 或 ||。當使用 ! 時,應該在兩邊都有空格。
if ($var == false and $other_var != 'some_value')
if ($var === false or my_function() !== false)
if ( ! $var)
类別/介面宣告
类別/介面宣告有下面一行的左大括號:
class Session
{
}
类別是空的情況下,括號将在同一行上如同定義:
class Empty_Class { }
函式/方法/閉包(closure)宣告
函式/方法/閉包(closure)的左大括號必須總是在新的一行開始, 其結構具有相同的縮排。
class Session
{
public static function get_flash($name, $data)
{
$closure = function($a, $b)
{
// 你的閉包(closure)程式码
}
}
}
變数
當初始化變数時,應每一行宣告一个變数。为了提高程式码的可讀性, 这些都應該是獨立的一行。適當的對齊值和註解。
$var = ''; // 每一个都在自己的行处理
$other_var = ''; // 每一个都在自己的行处理
中括號和括號
左中括號/括號前後應該沒有空格,右中括號/括號前不應該有空格。
$array = array(1, 2, 3, 4);
$array['my_index'] = 'something';
for ($i = 0; $i < $max; $i++)
字串引號
多用单引號,少用雙引號。
連接
在組合字串連接部分的兩邊不應該包含空格。
// 是
$string = 'my string '.$var.' the rest of my string';
// 否
$string = 'my string ' . $var . ' the rest of my string';
運算子
$var = 'something';
if ($var == 'something') // 在邏輯運算子前後加上空格
$var = $some_var + $other_var; // 在数學運算子前後加上空格
$var++; // 遞增前無空格
++$var; // 遞增後無空格
陣列句點表示法
雖然嚴格來說它不是一个编码标准,但在框架範圍內的类別和此文件中大量使用, 并且因为它不是一个常見的 PHP 表示法,它可能会混淆初使用框架的人們。
// 當你看見 "always_load.packages = array()",它是以下的简寫:
array("always_load" => array("packages" => array(...) ) );
此表示法被用在 Arr 类別、以及 Lang、Config 和 Session 类別,以快速從一个多維陣列訪問个別元素。
// 當你有一个陣列結構像这樣
$array = array(
"always_load" => array(
"packages" => array(
"orm",
"package" => "/my/special/package.php",
)
)
);
// 那麼这将回傳 "/my/special/package.php":
$path = Arr::get($array, 'always_load.packages.package');