ThinkPHP 3.2 是國產 MVC 框架的經典版本,雖已停止維護,但大量存量專案仍在運行。理解其核心機制有助於維護遷移。
ThinkPHP/ 框架核心
├─ThinkPHP.php 入口檔案
├─Common/ 公共函數
├─Conf/ 慣例配置
├─Extend/ 擴展庫
├─Lang/ 語言包
├─Lib/
│ ├─Behavior/ 行為擴展
│ ├─Core/ 核心基類
│ ├─Driver/ 驅動
│ └─Template/ 模板引擎
└─Tpl/ 系統模板
App/ 應用目錄
├─Common/ 專案公共
├─Conf/config.php 專案配置
├─Lib/
│ ├─Action/ 控制器
│ ├─Model/ 模型
│ └─Widget/ 元件
├─Runtime/ 運行緩存
└─Tpl/ 視圖模板
| 模式 | URL 範例 | 特點 |
|---|---|---|
| PATHINFO (預設) | /index.php/Module/Action/key/val | SEO 友好、需重寫支援 |
| 普通 | /index.php?m=Module&a=Action&key=val | 相容性最好 |
| REWRITE | /Module/Action/key/val | 最美觀、需 .htaccess/nginx 規則 |
| 兼容 | /index.php?s=Module/Action/key/val | 不支援 PATHINFO 環境的備選 |
啟用 REWRITE 需在 Apache .htaccess 或 Nginx location / { try_files $uri $uri/ /index.php?s=$uri; } 配置。
<?php
// 實例化模型(推薦 M 方法,自動快取)
$User = M('User'); // 對應 tp_user 表 (DB_PREFIX='tp_')
// 查詢
$all = $User->select(); // 全部
$one = $User->find(1); // 主鍵查單筆
$name = $User->where('id', 1)->getField('username'); // 取單欄
$list = $User->where('status', 1)->order('id desc')->limit(10)->select();
// 表達式查詢
$User->where('id', ['lt', 10])->select(); // id < 10
$User->where('name', ['like', '%張%'])->select(); // 模糊
$User->where('id', ['between', [5, 10]])->select();
$User->where('id', ['in', [1,3,5]])->select();
$User->where('id', ['not in', [1,3,5]])->select();
// 區間/複合
$User->where('id', [['gt', 4], ['lt', 10]])->select(); // 4 < id < 10 (AND)
$User->where('id', [['gt', 4], ['lt', 10], 'or'])->select(); // OR
// 統計
$count = $User->count();
$maxId = $User->max('id');
// 原生 SQL
$User->query("SELECT * FROM tp_user WHERE id > 5");
$User->execute("INSERT INTO tp_user (name) VALUES ('test')");
| 方法 | 用途 | 範例 |
|---|---|---|
| where | 條件 | ->where('id', 1) |
| order | 排序 | ->order('id desc, create_time asc') |
| limit | 分頁/限制 | ->limit(10) ->limit(0,10) |
| field | 選取欄位 | ->field('id,name') ->field('id', true) 排除 |
| table | 指定表 | ->table('tp_user u')->join('tp_profile p ON u.id=p.uid') |
| group/having | 分組 | ->group('dept')->having('count(*)>5') |
| join | 關聯 | ->join('tp_profile p ON u.id=p.uid', 'LEFT') |
| cache | 查詢緩存 | ->cache(true, 300) |
{$name} // 純量
{$user.name} // 物件屬性
{$user['name']} // 陣列鍵值
{$list[0].name} // 索引陣列
{$data|md5} // 單函數
{$time|date='Y-m-d H:i:s',###} // 帶參數函數 (### 代表變數本身)
{$name|default='預設值'}
<if condition="$user.status eq 1">正常<else/>停用</if>
<switch name="role">
<case value="1">管理員</case>
<case value="2">編輯</case>
<default/>訪客
</switch>
<volist name="list" id="vo">
{$vo.name} - {$vo.email}<br/>
</volist>
<foreach name="list" item="vo" key="k">
{$k} : {$vo}<br/>
</foreach>
<present name="var">有值<else/>無值</present><empty name="var">空<else/>非空</empty><in name="id" value="1,2,3">在<else/>不在</in><between name="age" value="18,60">區間內<else/>不在</between>{* Layout.html *}
<html><body>
<include file="Public:header" />
{__CONTENT__}
<include file="Public:footer" />
</body></html>
{* 子模板 *}
{extend name="Layout" /}
{block name="content"}具體內容{/block}
啟用:'LAYOUT_ON'=>true, 'LAYOUT_NAME'=>'Layout'
class IndexAction extends Action {
public function _empty($name) {
$this->error("操作 $name 不存在", U('Index/index'));
}
}
class EmptyAction extends Action {
public function index() {
$this->display("Public:404");
}
}
protected function _before_index() { /* 執行 index 前 */ }
protected function _after_index() { /* 執行 index 後 */ }
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' => [
// 靜態
'about' => 'Index/about',
// 動態
'user/:id' => 'User/profile',
'article/:year/:month/:id' => 'Article/view',
// 正則 (優先級高)
'/^item\/(\d+)$/' => 'Item/view?id=:1',
// 完整匹配
'search$' => 'Search/index',
],
注意:複雜規則優先、使用 $ 鎖定結尾、正則捕獲組對應 :1 :2。
'APP_GROUP_LIST' => 'Home,Admin',
'DEFAULT_GROUP' => 'Home',
'APP_GROUP_MODE' => 1, // 獨立分組模式
'APP_GROUP_PATH' => 'Modules', // 模組目錄
目錄結構:
Modules/
├─Home/
│ ├─Conf/config.php
│ ├─Common/function.php
│ ├─Action/
│ ├─Model/
│ └─Tpl/
└─Admin/
├─Conf/config.php
...
// 判斷 AJAX
if (IS_AJAX) { ... } // 或 $this->isAjax()
// 取得參數 (自動判斷 GET/POST,支援預設值、過濾)
$name = I('name', 'default', 'htmlspecialchars');
$ids = I('post.ids/a'); // 強制陣列
// 表單驗證
if (!IS_POST) $this->error('非法請求');
// 回傳 JSON
$this->ajaxReturn(['status'=>1, 'msg'=>'ok', 'data'=>$list]);
// 或
echo json_encode(['status'=>1, 'data'=>$list]); exit;
| 函數 | 用途 |
|---|---|
| C('KEY') | 讀取配置 |
| U('Action/method', ['id'=>1]) | 生成 URL |
| I('get.id', 0, 'intval') | 安全取輸入 |
| D('User') | 實例化模型 (支援自定義模型類) |
| M('User') | 快速實例化基礎模型 |
| F('cache_key', $data, 'path') | 檔案緩存讀寫 |
| S('key', $data, 3600) | 緩存 (支援 Memcached/Redis) |
ThinkPHP 3.2 已停止更新,建議漸進式遷移至 ThinkPHP 6.0+ 或 Laravel: