ThinkPHP 常用路徑常量詳解:__ROOT__、__APP__、__MODULE__、__CONTROLLER__、__ACTION__ 實測對照表
ThinkPHP 3.2/5.0/5.1/6.0 版本間常量有差異,本文以 **TP 3.2/5.0 典型單入口模式** 為例,在控制器方法中實測輸出,助你快速定位資源路徑、生成 URL。
一、測試代碼
<?php
namespace Home\Controller;
class ApiController extends \Think\Controller {
public function test() {
echo '__DIR__: ' . __DIR__ . '<br/>';
echo '__FILE__: ' . __FILE__ . '<br/>';
echo '__ROOT__: ' . __ROOT__ . '<br/>';
echo '__APP__: ' . __APP__ . '<br/>';
echo '__MODULE__: ' . __MODULE__ . '<br/>';
echo '__CONTROLLER__: ' . __CONTROLLER__ . '<br/>';
echo '__ACTION__: ' . __ACTION__ . '<br/>';
echo '$_SERVER[PHP_SELF]: ' . $_SERVER['PHP_SELF'] . '<br/>';
echo '$_SERVER[SCRIPT_NAME]: ' . $_SERVER['SCRIPT_NAME'] . '<br/>';
echo '$_SERVER[SCRIPT_FILENAME]: ' . $_SERVER['SCRIPT_FILENAME'] . '<br/>';
echo '$_SERVER[REQUEST_URI]: ' . $_SERVER['REQUEST_URI'] . '<br/>';
echo '$_SERVER[HTTP_HOST]: ' . $_SERVER['HTTP_HOST'] . '<br/>';
// 實際生成圖片 URL 測試
echo '<img src="' . __ROOT__ . '/Public/banner1.jpg">';
}
}
二、實測輸出 (假設項目部署在 https://localhost/tpapp/)
| 常量/變量 | 輸出值 | 說明 |
__DIR__ | D:\WWW\tpapp\Application\Home\Controller | 當前文件所在目錄 (PHP 魔術常量) |
__FILE__ | D:\WWW\tpapp\Application\Home\Controller\ApiController.class.php | 當前文件完整路徑 |
__ROOT__ | /tpapp | **項目入口對應的 URL 路徑** (無域名),生成靜態資源 URL 核心 |
__APP__ | /tpapp/index.php (或 /tpapp 隱藏 index.php 時) | 入口文件 URL 路徑 |
__MODULE__ | Home | 當前模塊名 |
__CONTROLLER__ | Api | 當前控制器名 (不含 Controller 後綴) |
__ACTION__ | test | 當前方法名 |
$_SERVER['PHP_SELF'] | /tpapp/index.php/home/api/test | 當前執行腳本相對文檔根目錄路徑 |
$_SERVER['SCRIPT_NAME'] | /tpapp/index.php | 入口文件路徑 |
$_SERVER['SCRIPT_FILENAME'] | D:/WWW/tpapp/index.php | 入口文件物理路徑 |
$_SERVER['REQUEST_URI'] | /tpapp/index.php/home/api/test | 完整請求 URI (含查詢串) |
$_SERVER['HTTP_HOST'] | localhost | 請求 Host |
三、常見用法速查
<?php
// 1. 模板中引入 CSS/JS/圖片 (推薦 __ROOT__)
<link href="__ROOT__/Public/css/app.css" rel="stylesheet">
<script src="__ROOT__/Public/js/app.js"></script>
<img src="__ROOT__/Public/images/logo.png">
// 2. 生成模塊/控制器/操作 URL (U 函數更推薦)
$url = __ROOT__ . '/' . __MODULE__ . '/' . __CONTROLLER__ . '/' . __ACTION__;
// 等價於
$url = U(__MODULE__ . '/' . __CONTROLLER__ . '/' . __ACTION__);
// 3. 判斷當前模塊/控制器高亮導航
if (__CONTROLLER__ === 'Index') { echo 'class="active"'; }
// 4. 獲取項目物理路徑 (上傳保存、日志寫入)
$uploadDir = __DIR__ . '/../../../Public/Uploads/';
// 或 ThinkPHP 內置
$uploadDir = APP_PATH . '../Public/Uploads/';
四、版本差異提示
| 版本 | 常量狀態 | 推薦做法 |
| TP 3.2 | 內置 __ROOT__ 等常量 | 直接使用 |
| TP 5.0/5.1 | **移除** 部分常量,改用 Request::root()、Request::module() 等 | 統一用 Request 門面或助手函數 url()/asset() |
| TP 6.0 | 完全移除,PSR-7 Request 對象 | $request->rootUrl()、$request->module()、asset() 助手 |
五、避坑指南
- 不要在模板中硬編碼
/tpapp/,部署子目錄變更時全壞,務必用 __ROOT__ 或 {:request.root()}。
- 開啟 URL_REWRITE 隱藏 index.php 後,
__ROOT__ 仍正常指向項目根 URL (如 /tpapp),__APP__ 可能變為 /tpapp。
- 多入口模式 (如
admin.php、api.php) 下,__ROOT__ 指向當前入口所在目錄,需注意區分。