首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 3.2 核心知識體系完整梳理:MVC、路由、模板、分組與 AJAX 實戰

     編輯:PHP 相關知識

框架概覽

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/              視圖模板

MVC 與 URL 訪問模式

模式URL 範例特點
PATHINFO (預設)/index.php/Module/Action/key/valSEO 友好、需重寫支援
普通/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; } 配置。

模型操作精華 (CURD)

<?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'

控制器進階

空操作 / 空模組(通用 404 處理)

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 與表單處理最佳實踐

// 判斷 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:

  1. 先抽離業務邏輯到 Service 層,減少控制器耦合。
  2. 將 Model 遷移為獨立 Repository + Entity。
  3. 模板改用 Blade / Twig,或前端分離改用 Vue/React。
  4. 路由、中介層、依賴注入逐步對齊現代框架概念。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved