**命名**
* 函數的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如 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();
```