ThinkPHP8.0遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:
目录和文件
目录使用小写+下划线;
类库、函数文件统一以.php为后缀;
类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
类(包含接口和Trait)文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
类名(包括接口和Trait)和文件名保持一致,统一采用驼峰法命名(首字母大写);
函数和类、属性命名
类的命名采用驼峰法(首字母大写),例如 User、UserType;
函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;
方法的命名使用驼峰法(首字母小写),例如 getUserName;
属性的命名使用驼峰法(首字母小写),例如 tableName、instance;
特例:以双下划线__打头的函数或方法作为魔术方法,例如 __call 和 __autoload;
常量和配置
常量以大写字母和下划线命名,例如 APP_PATH;
配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;
环境变量定义使用大写字母和下划线命名,例如APP_DEBUG;
数据表和字段
数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表及字段命名。
1. **基本编码原则**
- **代码缩进与空格**
- 统一使用4个空格进行缩进,避免使用制表符(Tab),这样可以保证代码在不同的编辑器和环境下具有一致的缩进效果。在运算符两侧、逗号后面等位置适当添加空格,以增强代码的可读性。例如:
```php
$result = $a + $b;
$array = [1, 2, 3];
```
- **代码注释**
- 对于复杂的代码逻辑、函数、类等要添加足够的注释。注释应该清晰明了,解释代码的功能、目的以及可能的注意事项。ThinkPHP支持多种注释风格,包括块注释(`/* */`)和行注释(`//`)。例如:
```php
// 这个函数用于获取用户信息
function getUserInfo($userId)
{
/*
* 下面的代码通过模型查询用户信息
* 首先实例化用户模型,然后调用查询方法
*/
$userModel = new UserModel();
$userInfo = $userModel->getUserInfoById($userId);
return $userInfo;
}
```
2. **控制器规范**
- **继承关系**
- 控制器类通常继承自`think\Controller`或其相关的抽象类,以获取基础的控制器功能,如视图渲染、请求处理等。例如:
```php
namespace app\controller;
use think\Controller;
class UserController extends Controller
{
// 控制器方法
}
```
- **请求方法处理**
- 对于不同的请求方法(GET、POST、PUT、DELETE等),可以通过在控制器方法名前添加对应的请求方法名(小写)来进行区分。例如,`getUserList`方法用于处理GET请求获取用户列表,`postUserInfo`方法用于处理POST请求提交用户信息。
- **视图渲染**
- 当需要渲染视图时,要遵循ThinkPHP的视图渲染规则。可以使用`return view('template_name', $data)`的方式来返回视图,其中`template_name`是视图模板的名称,`$data`是传递给视图的数据。例如:
```php
public function getUserList()
{
$userList = $this->userModel->getUserList();
return view('user/list', ['userList' => $userList]);
}
```
3. **模型规范**
- **模型定义与继承**
- 模型类一般继承自`think\Model`,这样可以利用ThinkPHP提供的数据库操作方法。例如:
```php
namespace app\model;
use think\Model;
class UserModel extends Model
{
// 模型属性和方法
}
```
- **数据库连接与表关联**
- 如果需要指定模型对应的数据库表,可以通过`protected $table = 'table_name';`来定义。对于关联关系(如一对一、一对多、多对多),ThinkPHP提供了一系列的关联方法,如`hasOne`、`hasMany`、`belongsTo`、`belongsToMany`等。例如,定义一个用户模型和用户角色模型的一对多关系:
```php
class UserModel extends Model
{
protected $table = 'users';
public function roles()
{
return $this->hasMany('RoleModel', 'user_id');
}
}
```
4. **视图规范(以ThinkPHP自带模板引擎为例)**
- **模板文件命名与存放位置**
- 模板文件通常存放在`app/view`目录下,文件名采用小写字母加下划线的方式命名,如`user_list.html`。不同的控制器对应的视图可以存放在不同的子目录下,便于管理。
- **模板语法**
- 使用ThinkPHP的模板引擎语法进行数据展示和逻辑处理。例如,使用`{$variable}`来输出变量,`{if condition="..."}...{/if}`来进行条件判断,`{volist name="list" id="item"}...{/volist}`来进行循环遍历。例如:
```html
<ul>
{volist name="userList" id="user"}
<li>{$user.name}</li>
{/volist}
</ul>
```
5. **数据库操作规范**
- **查询构建器使用**
- 尽量使用ThinkPHP的查询构建器来进行数据库操作,它提供了一种安全、高效的方式来构建SQL查询。例如,使用`Db::table('table_name')->where('condition')->select()`来进行查询。例如:
```php
$userList = Db::table('users')->where('status', 1)->select();
```
- **数据验证与过滤**
- 在进行数据库插入和更新操作之前,要对数据进行验证和过滤,防止SQL注入等安全问题。ThinkPHP提供了数据验证器(`think\Validate`)来帮助完成这个任务。例如:
```php
$data = [
'name' => $input['name'],
'email' => $input['email']
];
$validate = new Validate([
'name' => 'require|max:20',
'email' => 'email'
]);
if (!$validate->check($data)) {
// 数据验证不通过的处理
} else {
// 数据验证通过,进行数据库插入等操作
}
```