编码标准

这些程式码格式與文件的标准,必須被任何對 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

關鍵字

truefalsenullas 等關鍵字應該全部小寫, 因为大寫保留給常数。同樣適用於原始类型,如 arrayintegerstring

$var = true;
$var = false;
$var = null;
foreach ($array as $key => $value)
public function my_function(array $array)
function my_function($arg = null)

控制結構

結構關鍵字例如 ifforforeachwhileswitch 應該在一个空格後面加參数/變数列表和值。 大括號應該被放在新的一行,并且 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 時獲得执行。
ifelse 兩者都需要時不要使用,只在单一條件語句的情況下使用。

// 代替 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, 且當此比較回傳类型敏感的運算子如 ===!==。 此外,使用 andor&&|| 來得有可讀性。在某些情況下, 如其所需也許会不可避免的使用 &&||。當使用 ! 時,應該在兩邊都有空格。

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');