## 文件格式
- #### 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');
~~~