惯例及编码风格
我们鼓励您在编码的过程中遵循和Kohana一致的编码风格,因为这样不仅增强了代码的可读性,而且便于您的代码更容易地分享和贡献出去。原文
类命名方式及对应文件位置
在Kohana里,类名都遵循着一个严格的约定以便于自动加载。类名中需要区分的单词要用下划线来分割,同时单词的首字母须大写。下划线十分重要,因为它们直接反映了文件在文件系统中的位置。原文
以下惯用法适用:原文
例子 {#class-name-examples}
记住,在一个类的名称里一个下划线就意味着一个新的子目录,请参考下面的例子:原文
类名 | 文件路径 |
---|---|
Controller_Template | classes/controller/template.php |
Model_User | classes/model/user.php |
Database | classes/database.php |
Database_Query | classes/database/query.php |
Form | classes/form.php |
编码标准
为了写出高度一致性的源代码,我们要求每一个人尽量遵循编码标准。原文
括号
请使用BSD/Allman 风格 bracketing.
花括号
花括号被置于单独的行,并且和控制语句保持同样的缩进。原文
// 正确
if ($a === $b)
{
...
}
else
{
...
}
// 错误
if ($a === $b) {
...
} else {
...
}
类的括号
花括号使用规则的唯一例外是,类定义时左花括号应位于类名的同一行。原文
// 正确
class Foo {
// 不正确
class Foo
{
空括号
空括号之间不需要任何字符,留空即可。原文
// Correct
class Foo {}
// Incorrect
class Foo { }
数组的括号
数组的括号应该在一行上,或者在多行。原文
array('a' => 'b', 'c' => 'd')
array(
'a' => 'b',
javascript:void(0); ‘c’ => ‘d’, )
左括号
数组的左括号应位于array关键词的同一行。原文
// 正确
array(
...
)
// 不正确:
array
(
...
)
右括号
一维数组
由多行组成的一维数组的右括号应独占一行,并且保持与赋值语句一致的缩进。原文
// 正确
$array = array(
...
)
// 不正确
$array = array(
...
)
多维数组
嵌套数组向右缩进一个制表位,其余格式则遵循一维数组的规则。原文
// 正确
array(
'arr' => array(
...
),
'arr' => array(
...
),
)
array(
'arr' => array(...),
'arr' => array(...),
)
数组作为函数实参
// 正确
do(array(
...
))
// 不正确
do(array(
...
))
正如对数组的左括号的注解,单行语法在这里同样生效。原文
// 正确
do(array(...))
// 实参较长时的另一种选择
do($bar, 'this is a very long line',
array(...));
命名惯例
Kohana使用下划线命名方式,而非驼峰命名规则。原文
类
// 控制器类,使用 Controller_ 作为前缀
class Controller_Apple extends Controller {
// 模型类,使用 Model_ 作为前缀
class Model_Cheese extends Model {
// 普通累
class Peanut {
在创建类实例时,不要使用圆括号除非你要给构造函数传递实参。原文
// 正确:
$db = new Database;
// 不正确:
$db = new Database();
函数和方法
所有函数名都必须小写并且使用下划线来分隔单词:原文
function drink_beverage($beverage)
{
变量
所有变量都应该小写,并且要使用下划线而不是驼峰规则来分隔变量名中的单词:原文
// 正确:
$foo = 'bar';
$long_example = 'uses underscores';
// 不正确:
$weDontWantThis = 'understood?';
缩进
你必须使用制表符Tab来缩进你的代码,反之使用空格来进行则是被严格禁止的。原文
垂直间距(对多行而言)由空格来完成,而制表符Tab则不适合垂直对齐,因为不同人的制表宽度并不一致。原文
$text = 'this is a long text block that is wrapped. Normally, we aim for '
.'wrapping at 80 chars. Vertical alignment is very important for '
.'code readability. Remember that all indentation is done with tabs,'
.'but vertical alignment should be completed with spaces, after '
.'indenting with tabs.';
字符串连接
不要将空格置于字符串连接符的周围:原文
// 正确:
$str = 'one'.$var.'two';
// 不正确:
$str = 'one'. $var .'two';
$str = 'one' . $var . 'two';
单行语句
单行if语句应该只在需要打断正常执行流程时使用:原文
// 可接受的:
if ($foo == $bar)
return $foo;
if ($foo == $bar)
continue;
if ($foo == $bar)
break;
if ($foo == $bar)
throw new Exception('You screwed up!');
// 不可接受的:
if ($baz == $bun)
$baz = $bar + 2;
比较运算符
请使用OR和AND来做比较运算符:原文
// 正确:
if (($foo AND $bar) OR ($b AND $c))
// 不正确:
if (($foo && $bar) || ($b && $c))
请使用elseif,而非else if:原文
// 正确:<!--: test -->
elseif ($bar)
// 不正确:
else if($bar)
Switch结构
case,break及default都应独占一行,同时case和default区块内容均需要缩进一个tab制表符。原文
switch ($var)
{
case 'bar':
case 'foo':
echo 'hello';
break;
case 1:
echo 'one';
break;
default:
echo 'bye';
break;
}
圆括号
判断语句关键字和左圆括号之间应使用一个空格来分隔,字符!(惊叹号)两边都必须要有一个空格来隔开以使可读性最大化。例外的是单独的惊叹号和类型转换操作,在这两种情况下的左括号之后和右括号之前都不需要任何空格。原文
// 正确:
if ($foo == $bar)
if ( ! $foo)
// 不正确:
if($foo == $bar)
if(!$foo)
if ((int) $foo)
if ( $foo == $bar )
if (! $foo)
三元运算符
所有的三元操作符都应该遵循一个标准格式。圆括号只能用于完整的表达式而不是只将变量括起来。原文
$foo = ($bar == $foo) ? $foo : $bar;
$foo = $bar ? $foo : $bar;
所有的比较和操作符必须在一组圆括号内部进行:原文
$foo = ($bar > 5) ? ($bar + $foo) : strlen($bar);
如要将复杂的三元运算表达式拆分成多行(三元表达式的第一部分超过了80个字符),则需在连续行的运算符的前面使用空格来排列这些运算符:原文
$foo = ($bar == $foo)
? $foo
: $bar;
类型转换
类型转换时,需要在目标类型两边跟上空格:原文
// 正确:
$foo = (string) $bar;
if ( (string) $bar)
// 不正确:
$foo = (string)$bar;
如果可以,请尽量使用类型转换操作来代替三元运算操作:原文
// 正确:
$foo = (bool) $bar;
// 不正确:
$foo = ($bar == TRUE) ? TRUE : FALSE;
当类型转换成整形或布尔型时,请用短格式:原文
// 正确:
$foo = (int) $bar;
$foo = (bool) $bar;
// 不正确:
$foo = (integer) $bar;
$foo = (boolean) $bar;
常量
常量始终使用大写形式:原文
// 正确:
define('MY_CONSTANT', 'my_value');
$a = TRUE;
$b = NULL;
// 不正确:
define('MyConstant', 'my_value');
$a = True;
$b = null;
在作比较运算时应将常量置于的表达式的右端:原文
// 正确:
if ($foo !== FALSE)
// 不正确:
if (FALSE !== $foo)
不过这样的选择确实有一些微小的争议,所以我会来解释其中的依据。如果我们将前面的例子转换为普通的英文来表述,那么其中“正确”的列子则读作:原文
if variable $foo is not exactly FALSE [参考译文:如果变量$foo并不完全就是FALSE]
而“不正确”的例子则会读作:原文
if FALSE is not exactly variable $foo [参考译文:如果FALSE并不不全就是变量$foo]
从左到右的方向读,你会发现放在前面的常量没有任何意义。原文
注释
单行注释
使用//,在你代码的上面一行进行注释,并且要与其后的起始字符相隔一个空格,字母开头的注释要大写。原文
// Correct
//Incorrect
// incorrect
# Incorrect
正则表达式
当编写正则表达式的时候,请使用PCRE的风格而不是POSIX风格。因为PCRE更强大并且更快速。原文
// 正确:
if (preg_match('/abc/i', $str))
// 不正确:
if (eregi('abc', $str))
正则表达串外面应使用单引号而不是使用双引号来包围。使用单引号的字符串因为简单所以更方便。不像使用双引号的字符串那样支持插入变量和反斜线,蔽日 \n 或 \td 等等……原文
// 正确:
preg_match('/abc/', $str);
// 不正确:
preg_match("/abc/", $str);
当使用正则表达式来搜索和体会时,请使用向后引用$n,比起\n这种形式来说。原文
// 正确:
preg_replace('/(\d+) dollar/', '$1 euro', $str);
// 不正确:
preg_replace('/(\d+) dollar/', '\\1 euro', $str);
最后,请注意到用来匹配字符串末端位置的美元符号$允许新行的字符。如果需要,则使用修正符D来解决这个需求。源码
$str = "email@example.com\n";
preg_match('/^.+@.+$/', $str); // TRUE
preg_match('/^.+@.+$/D', $str); // FALSE