### 2018 年 12 月 15 日 發(fā)布
>[info] ThinkPHP作為堅(jiān)持十多年的老牌框架,始終秉承著「大道至簡,開發(fā)由我」的開發(fā)理念,逐漸形成了一套自己的開發(fā)規(guī)范,在歷史版本的迭代過程中,也曾多次完善并趨于規(guī)范。
本文就來總結(jié)下目前最新版本的開發(fā)規(guī)范,但可能由于篇幅原因無法涵蓋所有的PHP開發(fā)規(guī)范,而僅僅是框架層面的使用規(guī)范。建議閱讀官方開發(fā)者周刊第3期發(fā)布過的「[PHP版的代碼整潔之道 中文翻譯](https://github.com/php-cpm/clean-code-php)」以及「[PHP之道](http://www.imay365.com/thinkphp/php-the-right-way/3126)」作為本文很好的代碼規(guī)范補(bǔ)充,相信一定會(huì)獲益良多。
## 選擇合適的版本
### 框架版本
ThinkPHP目前主要存在三個(gè)版本,很多人容易困惑到底應(yīng)該選擇哪個(gè)版本開發(fā)。如果你是新接觸ThinkPHP,那么毫無疑問`5.1`版本是當(dāng)然之選,時(shí)代在進(jìn)步,技術(shù)永遠(yuǎn)用新不用舊,何況沒有任何的包袱。
如果你之前接觸過`3.2`或者`5.0`版本,有線上運(yùn)營產(chǎn)品想升級(jí)到最新的版本,那我會(huì)建議你謹(jǐn)慎考慮,因?yàn)樯?jí)并非無縫,而且單純的升級(jí)代碼沒法真正使用和發(fā)揮新版的特性,如果開發(fā)思想不升級(jí)的話。最合適的選擇應(yīng)該是關(guān)注官方的安全更新,進(jìn)行小版本升級(jí)。
如果你的產(chǎn)品已經(jīng)被用戶廣泛使用,出于品牌戰(zhàn)略發(fā)展考慮,那我建議你在保留老版本運(yùn)營的前提下,盡快把基于`5.1 LTS`版本重構(gòu)納入下一代產(chǎn)品計(jì)劃,也許對(duì)一些新客戶有更好的說服力。
>[info] 任何時(shí)候,當(dāng)你開始規(guī)劃商業(yè)產(chǎn)品的開發(fā)工作,出于安全性和穩(wěn)定性考慮,應(yīng)該首先選擇最新的`LTS`版本。
下面給出官方主要版本的生命周期,供版本選擇參考:
|ThinkPHP版本|發(fā)布時(shí)間|BUG修復(fù)|安全更新|
|---|---|---|---|
|3.2(PHP5.3+)|2013年12月18日|結(jié)束服務(wù)|結(jié)束服務(wù)|
|5.0(PHP5.4+)|2016年9月15日|2019年1月1日|2020年1月1日|
|5.1 LTS(PHP5.6+)|2018年1月1日|2020年1月1日|2021年1月1日|
最后,如果你僅僅是因?yàn)榕d趣而非工作,并且樂于接受新技術(shù)和一定的探索精神,愿意給官方進(jìn)行測(cè)試反饋,那么`5.2`版本(目前還是`Beta`版本)不失為一個(gè)不錯(cuò)的選擇。歡迎有更多的朋友參與ThinkPHP下一代產(chǎn)品的建設(shè)和貢獻(xiàn)中。
### PHP版本
如果是新的項(xiàng)目,目前應(yīng)該盡量選擇PHP`7.1+`作為你的PHP版本(ThinkPHP`5.1`版本可以很好的支持`7.1+`),可以擁有更好的性能,不再建議使用低于`7.0`的版本,官方已經(jīng)不再提供技術(shù)支持服務(wù),意味著不會(huì)有任何的安全更新。
>[danger] 有些PHP擴(kuò)展可能不支持PHP的高版本,這個(gè)時(shí)候你要做出選擇,使用低版本還是尋求更好的擴(kuò)展解決方案。
## 保持測(cè)試環(huán)境和部署環(huán)境的一致性
在開發(fā)過程中,應(yīng)該盡量保持你的測(cè)試環(huán)境和正式部署環(huán)境的一致性,包括運(yùn)行環(huán)境和版本,無論在本地測(cè)試環(huán)境還是部署環(huán)境,都應(yīng)當(dāng)統(tǒng)一使用域名方式訪問,本地可以使用測(cè)試域名,例如你的正式部署域名為`thinkphp.cn`,那么本地測(cè)試環(huán)境可以使用`thinkphp`或者`thinkphp.test`作為測(cè)試域名,避免使用`localhost`或者`127.0.0.1`這種測(cè)試地址。對(duì)于有多個(gè)域名的部署應(yīng)用,本地也要盡量模擬多個(gè)域名。
## 配置部署忽略清單
項(xiàng)目根目錄下面有一個(gè)`.gitignore`文件,用于定義提交版本庫的時(shí)候哪些文件或者目錄需要忽略,設(shè)置忽略的文件不會(huì)被同步到遠(yuǎn)程服務(wù)器,只是用于本地開發(fā)。
該文件默認(rèn)內(nèi)容如下,你可以根據(jù)項(xiàng)目的目錄和規(guī)范進(jìn)行調(diào)整。
```
/.idea
/.vscode
/vendor
*.log
thinkphp
.env
```
項(xiàng)目使用的核心框架以及`composer`安裝的擴(kuò)展,不應(yīng)當(dāng)被同步到版本庫中,只需要同步`composer.json`以及`composer.lock`文件。然后在服務(wù)器端進(jìn)行`composer`更新。
## 使用統(tǒng)一的IDE以及代碼規(guī)范配置或者插件
項(xiàng)目團(tuán)隊(duì)?wèi)?yīng)當(dāng)盡量使用統(tǒng)一的IDE作為開發(fā)工具,并規(guī)范一致的代碼規(guī)范配置項(xiàng),如果使用的第三方代碼規(guī)范及自動(dòng)完成插件。如果團(tuán)隊(duì)成員較多而無法完全統(tǒng)一,最低限度,項(xiàng)目代碼風(fēng)格必須遵循`PSR-1`和`PSR-2`規(guī)范。
## 基本命名規(guī)范
ThinkPHP遵循`PSR-2`命名規(guī)范以及`PSR-4`自動(dòng)加載規(guī)范,并注意如下規(guī)范:
### 類和文件命名
* 類(包括接口、Trait)文件名和類名保持一致,并且使用首字母大寫的駝峰命名;
* 函數(shù)文件、配置文件、路由定義文件等文件名使用小寫規(guī)范;
* 無論類還是普通文件都使用`.php`后綴;
* 目錄名統(tǒng)一使用小寫規(guī)范,并且使用單數(shù)規(guī)范;
* 模板文件使用小寫規(guī)范;
### 配置和變量命名
* 配置參數(shù)名統(tǒng)一使用小寫規(guī)范;
* 常量定義統(tǒng)一使用大寫規(guī)范;
* 環(huán)境變量定義統(tǒng)一使用大寫規(guī)范;
### 函數(shù)和類、屬性命名
* 函數(shù)的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如 `get_client_ip`;
* 方法的命名使用駝峰法(首字母小寫),例如 `getUserName`;
* 屬性的命名使用駝峰法(首字母小寫),例如 `tableName`、`instance`;
* 特例:以雙下劃線`__`打頭的函數(shù)或方法作為魔術(shù)方法,例如` __call` 和 `__callStatic`;
### 數(shù)據(jù)表命名
數(shù)據(jù)表和字段采用小寫加下劃線方式命名,例如 `think_user `表和 `user_name`字段,禁止使用駝峰、中文或者拼音作為數(shù)據(jù)表及字段命名。
## 配置規(guī)范化
線上環(huán)境和本地測(cè)試環(huán)境應(yīng)該使用一致的配置文件,差異化的配置使用環(huán)境變量方式處理。本地環(huán)境可以通過定義`.env`文件(注意添加到忽略文件列表)來模擬環(huán)境變量。
在你需要差異化配置的參數(shù)中使用`env`函數(shù)定義,例如:
```
'db_host' => env('db_host', '127.0.0.1'),
```
然后在環(huán)境變量中或者本地`.env`中定義
```
DB_HOST = 192.168.0.12
```
盡量不要在配置文件以外使用`env`函數(shù)獲取配置參數(shù)。統(tǒng)一使用`config`函數(shù)獲取配置參數(shù)。
除了定義配置文件之外,避免使用動(dòng)態(tài)配置功能,保持僅讀取配置參數(shù)的良好習(xí)慣。
如果需要提高配置文件的性能,可以考慮使用`Yaconf`擴(kuò)展。ThinkPHP核心已經(jīng)支持`Yaconf`配置定義,參考:[在ThinkPHP使用Yaconf](https://blog.thinkphp.cn/783762)。
## 是否應(yīng)當(dāng)使用助手函數(shù)
助手函數(shù)的初衷是為了簡化代碼和更方便記憶,但如果不是很清楚助手函數(shù)的內(nèi)部實(shí)現(xiàn)原理,很容易導(dǎo)致濫用,例如`db`助手函數(shù)就是一個(gè)非常典型的例子。
`db`助手函數(shù)設(shè)計(jì)的時(shí)候,因?yàn)閌Db`類是一個(gè)靜態(tài)單例對(duì)象,而且`5.1`版本的數(shù)據(jù)查詢?cè)O(shè)計(jì)為每次查詢后不會(huì)清空當(dāng)前對(duì)象的查詢條件,為了避免下面的代碼查詢條件產(chǎn)生混淆,`db`函數(shù)被設(shè)計(jì)成每次重新連接。
```
db('user')->where('status', 1)->select();
db('user')->where('name', 'thinkphp')->select();
```
因此下面的代碼中,循環(huán)中的每次查詢都會(huì)重新連接一次數(shù)據(jù)庫,從而造成超過數(shù)據(jù)庫的最大連接數(shù)錯(cuò)誤。
```
foreach($users as $name) {
db('user')->where('name', $name)->update(['status' => 1]);
}
```
上面的代碼建議使用`Db`類直接操作
```
foreach($users as $name) {
Db::name('user')->where('name', $name)->update(['status' => 1]);
}
```
由于現(xiàn)代的IDE提示和自動(dòng)完成功能之強(qiáng)大,助手函數(shù)的作用非常有限,而且只會(huì)用助手函數(shù)對(duì)于框架的原理認(rèn)識(shí)較淺,因此建議是掌握助手函數(shù)的內(nèi)部實(shí)現(xiàn)原理后再來決定在項(xiàng)目規(guī)范中是否需要使用助手函數(shù),以及如何使用。
畢竟有些場景下,助手函數(shù)是非常簡單實(shí)用的,例如:
```
public function getUser($id)
{
$user = User::getOrEmpty($id);
return json($user);
}
```
產(chǎn)品交付給客戶的時(shí)候,有些時(shí)候助手函數(shù)能夠讓客戶自定義模板的時(shí)候更方便。
如果你需要額外定義或者覆蓋原有的助手函數(shù),可以直接在應(yīng)用的`common.php`公共文件中定義。
## 路由規(guī)范
統(tǒng)一使用路由方法注冊(cè)路由而不要再使用返回?cái)?shù)組配置,可以清晰直觀的看到每個(gè)路由規(guī)則的詳情,也便于開啟路由緩存。路由規(guī)則不區(qū)分大小寫,因此統(tǒng)一使用小寫定義。
盡量避免使用閉包定義路由規(guī)則(注意不要和分組路由的閉包定義搞混淆),否則無法使用路由緩存功能。
優(yōu)先使用資源路由定義,在不適用資源路由的情況下也要多使用路由分組,不僅可以簡化路由定義和提高性能,也更加規(guī)范。
大部分情況下,建議開啟全局路由完整匹配,個(gè)別不需要完整匹配的路由規(guī)則可以在定義的時(shí)候使用`completeMatch`方法單獨(dú)關(guān)閉。
```
Route::get('user/<name>', 'user/info')->completeMatch(false);
```
如果需要使用偽靜態(tài)地址,可以全局配置URL訪問后綴,對(duì)于個(gè)別特殊后綴的路由可以在路由定義的時(shí)候單獨(dú)指定。
```
Route::get('hello/<name>', 'index/hello')->ext('htm');
```
明確你的路由變量規(guī)則,不要忽略路由變量的規(guī)則定義,避免可能的解析錯(cuò)誤。例如,當(dāng)你的路由變量中使用了小數(shù)點(diǎn)或者斜線的情況,必須嚴(yán)格定義你的變量規(guī)則。
優(yōu)先在路由定義的時(shí)候指定中間件、進(jìn)行數(shù)據(jù)驗(yàn)證和請(qǐng)求緩存等操作,原則就是在路由里面能做的事情盡量提前不要等到控制器里面才執(zhí)行。
為了方便查看當(dāng)前項(xiàng)目定義的路由規(guī)則,可以使用下面的指令生成路由規(guī)則查看文件。
```
php think route:list
```
然后可以在`runtime`目錄下的`route_list.php`可以查看所有的路由列表,可以參考這篇:[命令行的表格輸出](https://blog.thinkphp.cn/754434)。
更多的路由使用技巧可以參考:[路由使用心得技巧](https://blog.thinkphp.cn/868952)。
## 控制器規(guī)范
為了避免命名沖突,可以統(tǒng)一開啟類庫后綴。
優(yōu)先使用資源控制器,可以通過命令行快速生成一個(gè)資源控制器類
```
php think make:controller index/Blog
```
控制器建議繼承一個(gè)公共的控制器類,便于統(tǒng)一調(diào)整和增加通用邏輯。并建議繼承系統(tǒng)的控制器類,以便于使用控制器中間件功能。
對(duì)于控制器操作方法的攔截以及統(tǒng)一處理應(yīng)當(dāng)使用中間件獨(dú)立操作。
控制器的代碼應(yīng)當(dāng)盡量少,以確保邏輯清晰和可讀性。始終保持`controller`層作為訪問控制器層的名稱。
請(qǐng)求數(shù)據(jù)的驗(yàn)證操作統(tǒng)一使用驗(yàn)證器進(jìn)行驗(yàn)證。
操作方法中的對(duì)象使用依賴注入,其它的必要參數(shù)使用參數(shù)自動(dòng)綁定。
不要在操作方法中輸出除了調(diào)試信息之外的任何內(nèi)容,而是通過`return`返回需要輸出的內(nèi)容。
操作方法中始終明確響應(yīng)輸出的類型,而不要依賴全局配置。
## 數(shù)據(jù)庫和模型規(guī)范
### 基本規(guī)范
* 主鍵統(tǒng)一使用`id`;
* 外鍵統(tǒng)一使用`resource_id`形式(例如`user_id`);
* 模型數(shù)據(jù)字段統(tǒng)一使用小寫+下劃線命名,和數(shù)據(jù)表字段規(guī)范一致;
* 數(shù)據(jù)表統(tǒng)一添加系統(tǒng)時(shí)間字段(`create_time`和`update_time`),并使用`datetime`類型;
* 使用軟刪除并添加時(shí)間字段`delete_time`,類型和系統(tǒng)時(shí)間字段保持一致;
* 模型類應(yīng)該繼承一個(gè)統(tǒng)一的公共類,便于調(diào)整和統(tǒng)一設(shè)置;
* 模型類應(yīng)當(dāng)通過定義`autoWriteTimestamp`屬性明確時(shí)間字段類型;
### 查詢規(guī)范
不要在數(shù)據(jù)庫配置文件以外的地方配置或者動(dòng)態(tài)設(shè)置數(shù)據(jù)庫連接信息,包括模型內(nèi)部也應(yīng)該僅使用配置參數(shù)名定義不同的數(shù)據(jù)庫連接。
盡量不使用原生SQL查詢,而應(yīng)當(dāng)使用查詢構(gòu)造器。
不要使用任何數(shù)據(jù)庫工具創(chuàng)建、修改數(shù)據(jù)表和填充數(shù)據(jù),應(yīng)當(dāng)使用[數(shù)據(jù)遷移](http://www.imay365.com/thinkphp/master-database-and-model/265553)并同步版本庫給所有成員。
每次數(shù)據(jù)查詢都用`Db`類或者模型類的靜態(tài)方法。
避免在模型方法中直接寫復(fù)雜的查詢條件,而應(yīng)當(dāng)使用查詢范圍或者搜索器統(tǒng)一定義后調(diào)用。用查詢表達(dá)式方式替代傳統(tǒng)的數(shù)組查詢。
查詢數(shù)據(jù)的處理統(tǒng)一使用獲取器定義,而不要直接處理數(shù)據(jù)。
對(duì)寫入數(shù)據(jù)需要額外處理的話統(tǒng)一使用修改器。
對(duì)于使用了SQL函數(shù)的用法,使用`fieldRaw`、`orderRaw`和`whereRaw`/`whereExp`替代`field`、`order`和`where`用法。
僅在使用字符串查詢條件,以及調(diào)用`whereExp`和`whereRaw`方法的時(shí)候需要使用手動(dòng)參數(shù)綁定,其余情況下都會(huì)自動(dòng)進(jìn)行參數(shù)綁定,也不要手動(dòng)調(diào)用`bind`方法。
不要在WEB訪問的時(shí)候進(jìn)行大量數(shù)據(jù)操作,容易超時(shí)的數(shù)據(jù)處理應(yīng)當(dāng)在命令行下通過創(chuàng)建指令完成。
更多的使用技巧可以參考:[提高開發(fā)效率的查詢技巧](https://blog.thinkphp.cn/848639)以及[模型關(guān)聯(lián)查詢不完全指南](https://blog.thinkphp.cn/852701)。
## 是否需要模型分層
一般情況下,僅僅使用Model層已經(jīng)夠用,但如果項(xiàng)目比較大,建議對(duì)模型進(jìn)行分層,例如使用數(shù)據(jù)層、邏輯層和服務(wù)層等等,視項(xiàng)目需求而定,原則就是避免某一層過大導(dǎo)致結(jié)構(gòu)雜亂,盡量讓各個(gè)層分工明確,各司其職。
## 模板規(guī)范
* 模板文件應(yīng)當(dāng)使用操作方法轉(zhuǎn)換為小寫+下劃線方式命名;
* 當(dāng)你需要跨模塊調(diào)用的時(shí)候,盡量在控制器操作方法中明確要渲染的模板;
* 避免在模板文件中添加邏輯代碼,應(yīng)當(dāng)只是數(shù)據(jù)的輸出;
* 盡量避免在模板文件中添加樣式和JS代碼,不得已的時(shí)候必須使用`{literal} {/literal}`包含起來;
* 使用`static`目錄統(tǒng)一存放靜態(tài)資源文件;
## 日志規(guī)范
確保設(shè)置日志的最大數(shù)量限制,避免日志空間過大。
```
'max_files' => 30
```
超過設(shè)置的數(shù)量后,最早的日志將會(huì)被自動(dòng)清理。
如果需要把日志接入阿里云,可以設(shè)置為單一日志文件,具體可以參考:[thinkphp日志接入阿里云日志系統(tǒng)](http://www.imay365.com/xieyongfa123/thinkphp_note/852704)
更多日志使用建議參考:[如何更有效的記錄和管理日志](https://blog.thinkphp.cn/817547)。
## 命令行規(guī)范
* 相關(guān)緩存指令應(yīng)當(dāng)在部署到服務(wù)器后執(zhí)行;
* 項(xiàng)目的指令應(yīng)當(dāng)添加獨(dú)立的指令空間,例如 `php think app:command_name`;
* 在`command.php`定義命令行指令列表的時(shí)候使用 “指令名 => 完整的類名”方式,提高性能;
## 寫更健壯的代碼
安全問題不容忽視,參考官方發(fā)布的[安全規(guī)范指引](https://blog.thinkphp.cn/789333),提前做好安全防范,讓你的項(xiàng)目更健壯。同時(shí)也要關(guān)注官方的[開發(fā)者周刊](http://www.imay365.com/thinkphp/weekly/content)和微信公眾號(hào),及時(shí)獲取官方的安全更新通告。
## 做好應(yīng)用優(yōu)化工作
參考[如何有效提高ThinkPHP的應(yīng)用性能](https://blog.thinkphp.cn/843679)一文做好相關(guān)優(yōu)化工作。
## 使用持續(xù)集成/持續(xù)部署構(gòu)建你的項(xiàng)目
如果條件允許,請(qǐng)使用[持續(xù)集成/持續(xù)部署](https://blog.csdn.net/sinat_35930259/article/details/79429743),并添加自動(dòng)化測(cè)試。[Travis CI](https://travis-ci.org/)或者[PHPCI](https://www.phptesting.org/)都是不錯(cuò)的選擇。
## 編寫項(xiàng)目文檔
每個(gè)項(xiàng)目都應(yīng)該在根目錄添加`readme.md` 文件,并遵循`Markdown`規(guī)范寫作,對(duì)項(xiàng)目做簡要的說明(尤其是目錄和代碼規(guī)范),如果項(xiàng)目比較復(fù)雜,可以附上一個(gè)項(xiàng)目詳細(xì)說明或者規(guī)范的文檔地址(托管到[看云文檔平臺(tái)](http://www.imay365.com)上是一個(gè)很好的選擇),如果你的項(xiàng)目是前后端完全分離開發(fā)的話,應(yīng)該事先規(guī)劃好后臺(tái)的API接口,然后在看云上創(chuàng)建一個(gè)**API文檔**,便于指導(dǎo)前端開發(fā)人員進(jìn)行接口調(diào)用,以及方便在線調(diào)試。
- 值得升級(jí)到5.1的18個(gè)理由
- 5.1.7版本新特性
- JSON字段類型在ORM中的使用
- 文件下載響應(yīng)對(duì)象
- 教你使用5.1的數(shù)組對(duì)象查詢
- 模型三大利器之一:搜索器
- 在ThinkPHP中使用Yaconf
- 掌握命令行的表格輸出
- 5.1.25查詢參數(shù)綁定的改進(jìn)
- ThinkPHP安全規(guī)范指引
- 巧用數(shù)據(jù)集的排序功能實(shí)現(xiàn)統(tǒng)計(jì)排序
- think-orm ——基于5.1的獨(dú)立ORM庫
- think-template——基于ThinkPHP的獨(dú)立模板引擎
- ThinkPHP5.1.26版本發(fā)布——修正版本,包含安全更新
- ThinkPHP5.0和3.2再發(fā)安全更新
- 官宣:ThinkPHP發(fā)布首個(gè)LTS版本
- 你真的了解Db類和模型的正確使用姿勢(shì)么?
- 如何更有效的記錄和管理日志
- 模型三大利器之二:修改器
- ThinkPHP5.1.28版本發(fā)布——修正上一版本問題,改進(jìn)關(guān)聯(lián)查詢
- 模型三大利器之三:獲取器
- API版本控制的幾種思路
- ThinkPHP5.2第一個(gè)Beta版本發(fā)布測(cè)試
- 讓你少犯錯(cuò)的數(shù)據(jù)查詢基本原則
- ThinkPHP發(fā)布5.1.29版本——常規(guī)更新
- 這15個(gè)好習(xí)慣讓你更容易升級(jí)到5.2
- 如何有效提高ThinkPHP的應(yīng)用性能
- 讓你提高開發(fā)效率的查詢技巧
- 模型關(guān)聯(lián)查詢不完全指南
- 5.2發(fā)布Beta2版本——統(tǒng)一和精簡大量用法
- ThinkPHP發(fā)布5.1.30版本——支持微秒時(shí)間字段寫入
- ThinkPHP的數(shù)據(jù)緩存使用
- ThinkPHP5.2安裝及入口文件
- ThinkPHP榮獲2018 年度最受歡迎中國開源開發(fā)框架第1名
- 5.1路由使用心得技巧
- ThinkPHP5.*版本發(fā)布安全更新
- ThinkPHP項(xiàng)目及代碼規(guī)范指北
- 5.2版本的設(shè)計(jì)規(guī)范指導(dǎo)
- ThinkPHP5.1.32版本發(fā)布——圣誕快樂
- 利用Trait特性給模型增加樂觀鎖功能
- 5.2數(shù)據(jù)庫和模型的變化(摘要)
- ThinkPHP模板引擎實(shí)現(xiàn)和常見問題
- ThinkPHP5.0.24版本發(fā)布——安全更新
- 不忘初心,方得始終——ThinkPHP十三周年報(bào)告
- ThinkPHP5+相關(guān)資源匯總
- 異步社區(qū)ThinkPHP周年慶專享優(yōu)惠活動(dòng)
- 5.2路由的調(diào)整和改進(jìn)
- ThinkPHP發(fā)布5.1.33版本——包含安全更新
- ThinkPHP擴(kuò)展開發(fā)指南
- ThinkPHP發(fā)布5.2Beta3版本
- ThinkPHP發(fā)布5.1.34版本——喜迎新年
- ThinkPHP發(fā)布5.2RC1版本
- ThinkPHP發(fā)布5.1.35版本——常規(guī)更新
- 5.2配置類的調(diào)整
- 5.2時(shí)間查詢的改進(jìn)和優(yōu)化
- 5.2RC版本升級(jí)不完全指導(dǎo)(僅供學(xué)習(xí)參考)
- ThinkPHP5.2版本正式變更為6.0版本
- ThinkPHP百度云云虛擬主機(jī)專享免費(fèi)活動(dòng)
- 事件系統(tǒng)以及查詢事件、模型事件的使用
- ThinkPHP6.0RC2版本發(fā)布——架構(gòu)升級(jí)、精簡核心
- ThinkPHP5.1.36LTS版本發(fā)布——常規(guī)更新
- 新版Session和Cookie設(shè)計(jì)變化
- ThinkPHP5.1.37版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC3版本發(fā)布——細(xì)節(jié)完善,體驗(yàn)優(yōu)化
- 6.0中間件使用詳解
- Composer各大廠商鏡像地址
- ThinkPHP6.0發(fā)布計(jì)劃公告
- 「ThinkPHP開發(fā)者周刊」招募志愿者
- ThinkPHP6.0日志變化
- ThinkPHP5.1.38版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC4版本發(fā)布——ORM獨(dú)立,日志多通道支持
- ThinkORM2.0開發(fā)指南上線
- ThinkPHP6.0RC5版本發(fā)布——多應(yīng)用模式獨(dú)立,中間件機(jī)制調(diào)整
- ThinkPHP6.0版本發(fā)布——程序員節(jié)福利
- ThinkPHP5.1.39LTS版本發(fā)布——常規(guī)更新
- ThinkPHP6.0.1版本發(fā)布——圣誕快樂!
- 回顧2019,展望2020!
- ThinkPHPV6.0.2版本發(fā)布——2020新春快樂!
- 周年福利系列:Swoole合作優(yōu)惠
- 億速云成為ThinkPHPV6.0獨(dú)家贊助發(fā)布商??
- 新冠疫情工具和限免資源專題(保持更新中)
- 周年福利系列:創(chuàng)宇信用認(rèn)證合作優(yōu)惠
- 周年福利系列:碼云企業(yè)版限時(shí)10%優(yōu)惠
- 周年福利系列:想天短說抵現(xiàn)優(yōu)惠
- think-swoole直播:從零開始掌握swoole開發(fā)
- 周年福利系列:B2C開源電商ShopXO授權(quán)8折優(yōu)惠
- 周年福利系列:LayuiAdmin 永久授權(quán)限時(shí)優(yōu)惠
- ThinkPHP資源導(dǎo)航站上線——構(gòu)建生態(tài) 服務(wù)未來
- ThinkPHP官方技術(shù)支持服務(wù)和應(yīng)用服務(wù)市場上線公測(cè)
- ThinkPHP市場精選——推廣基本要素
- ThinkPHP市場精選——客服聊天專題
- ThinkPHPV6.0.3版本發(fā)布——端午安康
- ThinkPHP開發(fā)者扶持計(jì)劃
- 6.0.3版本關(guān)鍵更新及升級(jí)事項(xiàng)
- 「ThinkPHP開發(fā)者周刊」改版重啟
- ThinkPHP市場精選——企業(yè)建站專題
- ThinkPHP 提供統(tǒng)一API接口服務(wù)
- ThinkPHP市場精選——直播電商專題
- ThinkAPI服務(wù)SDK發(fā)布
- 官方服務(wù)市場啟用獨(dú)立子域名
- ThinkPHP市場精選——刷臉支付專題
- ThinkAPI推出會(huì)員服務(wù)計(jì)劃
- ThinkPHPV6.0.4版本發(fā)布——中秋國慶雙節(jié)快樂
- ThinkPHPV5.1.40版本發(fā)布——常規(guī)更新
- 1024程序員節(jié)福利走一波
- ThinkPHP V6.0.5版本發(fā)布——兼容Composer2.0
- 知識(shí)圖譜應(yīng)用場景——源論技術(shù)沙龍
- ThinkPHP5.*版本改進(jìn)Composer2.0的兼容
- 官方市場雙十一精選推薦
- 技術(shù)人做產(chǎn)品有機(jī)會(huì)么(文末送課程)
- 本周秒殺——古德云售后獲客營銷系統(tǒng)
- ThinkAPI服務(wù)更新——支持接口分組和PHP版本依賴調(diào)整
- PHP8新特性盤點(diǎn)
- PHP8新特性系列:構(gòu)造器屬性提升使用及注意事項(xiàng)
- ThinkPHP2021新年寄語
- ThinkPHP V6.0.6&V5.1.41版本發(fā)布——兼容PHP8.0
- PHP如何更優(yōu)雅地調(diào)用API接口
- ThinkPHP V6.0.7發(fā)布——修正版本
- ThinkAPI服務(wù)更新——IP白名單
- 最新版ThinkORM對(duì)于時(shí)間字段的調(diào)整
- ThinkAPI短信接口正式上線
- ThinkPHP V6.0.8版本發(fā)布——多環(huán)境變量配置支持
- 頂想云寫作服務(wù)開啟第一次公測(cè)
- ThinkSSL上線——官方SSL/TLS證書服務(wù)
- MDBootstrap國內(nèi)用戶福利——ThinkPHP官方市場首發(fā)
- ThinkPHP V6.0.9版本發(fā)布——常規(guī)更新
- ThinkORM功能盤點(diǎn)——虛擬模型
- 全面支持主流GIT版本庫——云寫作服務(wù)第二次公測(cè)
- 云寫作服務(wù)私有化部署方案之:版本庫私有化
- 看云雙十一活動(dòng)
- ThinkPHP V6.0.10LTS發(fā)布——兼容PHP8.1
- ThinkPHP V6.0.12發(fā)布——命令行兼容8.1
- 頂想云知識(shí)管理上線公測(cè)——構(gòu)建企業(yè)文檔中心和知識(shí)庫
- 頂想云上線——助力生態(tài)數(shù)字化建設(shè)
- 618活動(dòng)進(jìn)行中——官方市場迎來一波更新
- 頂想云知識(shí)管理正式上線——看云文檔啟動(dòng)遷移服務(wù)
- ThinkPHP V6.0.13發(fā)布——常規(guī)更新
- 頂想云網(wǎng)站助理服務(wù)上線——構(gòu)建產(chǎn)品支持服務(wù)
- ThinkPHP發(fā)布6.1.0&6.0.14版本——安全更新
- ThinkPHP新版社區(qū)上線試運(yùn)營
- ThinkAPI上架人臉核身接口——助力網(wǎng)站實(shí)名認(rèn)證
- 辭舊迎新——舊版社區(qū)停止注冊(cè)及發(fā)帖
- ThinkPHP6.1.2版本發(fā)布——兼容PHP8.2
