**命名**
* 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;
* 方法、属性的命名使用驼峰法(首字母小写),例如 getUserName;
* V5.0.16+版本开始,默认的模板文件名规则改为实际操作方法名的小写+下划线写法。但可以配置template.auto_rule的值为2 恢复之前的全小写规则。
> 类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
> 方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
> 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。
* 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行。
```
foreach ($car['cartList'] as &$shop) {
}
// 这里不释放会影响下面的$shop ,因为引用无法再正常使用
unset($shop);
```
**多应用模式**
多应用模式部署后,记得删除app目录下的controller目录(系统根据该目录作为判断是否单应用的依据)
**权限**
在mac或者linux环境下面,注意需要设置runtime目录权限为777。<br>
**数据库规范**
* 模型类应该继承一个统一的公共类,便于调整和统一设置
* 对于使用了SQL函数的用法,使用fieldRaw、orderRaw和whereRaw/whereExp替代field、order和where用法
* 不要在WEB访问的时候进行大量数据操作,容易超时的数据处理应当在命令行下通过创建指令完成。
为了更好的有利于团队开发,我们做如下约定:
1. 每个表的关键字都是id,无符号(un)、类型默认int 11变成10、自增。
2. 第个表都存在create_time及update_time两个字段,用以记录新建与更新的时间,类型是int 10、无符号。
3. 字段为为xxxx_id的,对应的一定是xxxx表中的主键,类型为int 10、无符号un。
4. 所有字段属性均为not null,不能为null,并设置默认值为not null。
5. int类型与bool类型的值,默认值统一设置为0。
6. varchar、char、text类型的值,默认值统一设置为empty string。
**注意**
1. 框架建议的获取请求变量的方法是Request类的param方法(如非必要不要再使用get或者post方法获取,更不要使用原生的$_GET/$_POST等方法获取)。
2. 不要在数据库配置文件以外的地方配置或者动态设置数据库连接信息,包括模型内部。
3. 不要在控制器中使用包括die、exit在内的中断代码。如果你需要调试并中止执行,可以使用系统提供的halt助手函数。
4. 如果是新的项目,目前应该尽量选择PHP7.3+作为你的PHP版本,可以拥有更好的性能,ThinkPHP6.0版本不再支持低于7.1的版本。
5. 你应当把需要公共调用的部分设计为一个公共应用,并且禁止外部访问,只能通过内部调用,或者通过API接口的方式提供对外统一调用。
6. 自己建的extend类库,最好也要有命名空间。
**环境变量定义如何支持特殊字符**
如果要在环境变量定义文件中使用特殊字符,必须加上引号,例如:
```
[DATABASE]
USERNAME = root
PASSWORD = 'abc@^123'
```
**模型写法**
如果你的代码是写在模型内部的话(也就是你的查询代码是模型类的一个方法),获取模型数据的方式需要改成getAttr而不能使用对象属性方式直接获取。例如:
```
// 正确的用法
$user = $this->find();
echo $user->getAttr('name');
echo $user->getAttr('type');
```
可以给某个字段设置别名,例如:
```
Db::table('user')->field('id,nickname as name')->select();
```
group() 搭配 field() 获取某字段所有不通数值,等于去重
```
Db::name('user')->field('username')->group('username')->select();
```
因为 isset 是语言结构,strlen 是函数,所以使用 isset 比使用 strlen 效率更高。
比如判断一个字符串的长度是否小于 5:
if ( !isset ( $str{5} ) ) 就比 if ( strlen ( $str ) < 5 ) 好。
**最佳实践:模型查询和创建都使用静态方法**
模型的设计其实和Db一样,基本上不需要手动进行实例化。
```
// 写入新的数据
$user = User::create(['name' => '张三']);
// 更新数据
$user->update(['name' => '李四']);
// 查询单个数据
$user = User::find(1);
// 删除当前模型数据
$user->delete();
静态方法删除
User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);
```
入口文件index.php开启调试模式
```
$http = (new App())->debug(true)->http;
$response = $http->name('index')->run();
$response->send();
```