C() 是 ThinkPHP 核心配置管理方法,支援設定、獲取、批量賦值、二級陣列、快取持久化,是專案中最高頻使用的工具函數之一。
| 操作 | 語法 | 說明 |
|---|---|---|
| 單一設定 | C('DB_NAME', 'thinkphp') | 不分大小寫,建議全大寫 |
| 單一獲取 | $v = C('DB_NAME') | 未定義回傳 null |
| 二級設定 | C('USER.USER_ID', 8) | 支援點號分隔,不建議超過二級 |
| 二級獲取 | $v = C('USER.USER_ID') | |
| 批量設定 | C(['user_id'=>1, 'user_type'=>1]) | 傳入陣列即為批量模式 |
| 獲取全部 | $all = C() | 無參數回傳完整配置陣列 |
<?php
// 批量設定並持久化到快取(檔案/Redis/等)
$config = ['user_id' => 102, 'user_type' => 107];
C($config, 'user_profile'); // 第二參數為快取標識
// 後續請求直接讀回(自動合併到當前配置)
$profile = C('', 'user_profile'); // 第一參數留空
var_dump($profile); // 包含 user_id, user_type 及所有現有配置
?>
適用場景:使用者偏好設定、動態功能開關、多租戶配置隔離。
<?php
namespace Home\Controller;
use Think\Controller;
class DbSwitchController extends Controller {
public function switchDb($dbKey) {
// 1. 讀取預設資料庫配置組
$dbList = C('DB_LIST'); // 假設 config.php 定義 'DB_LIST' => ['main'=>..., 'log'=>...]
// 2. 驗證並切換
if (isset($dbList[$dbKey])) {
C($dbList[$dbKey]); // 批量覆蓋 DB_HOST, DB_NAME, DB_USER...
// 重新實例化 Model 即生效
$model = D('User');
return $model->select();
}
E('資料庫鍵值不存在');
}
}
?>
function C($name=null, $value=null) {
static $config = [];
// 獲取全部
if (is_null($name) && is_null($value)) return $config;
// 持久化讀取
if (is_null($name) && !is_null($value)) {
$cached = S($value); // 讀取快取
return $cached ? array_merge($config, $cached) : $config;
}
// 批量設定
if (is_array($name)) {
$config = array_merge($config, array_change_key_case($name, CASE_UPPER));
if (!is_null($value)) S($value, $config); // 持久化
return;
}
// 二級鍵值處理
$name = strtoupper($name);
if (strpos($name, '.') !== false) {
list($name, $sub) = explode('.', $name, 2);
}
// 設定值
if (!is_null($value)) {
if (isset($sub)) $config[$name][$sub] = $value;
else $config[$name] = $value;
return;
}
// 獲取值
if (isset($sub)) return isset($config[$name][$sub]) ? $config[$name][$sub] : null;
return isset($config[$name]) ? $config[$name] : null;
}
API_TIMEOUT,二級用點號 REDIS.DEFAULT_HOSTconfig.php (通用) → config_.php (環境差異) → C() (運行時覆蓋)cfg_ 避免衝突善用 C() 的多態簽名與持久化特性,能讓 ThinkPHP 專案配置管理既靈活又高效。記住:靜態配置寫檔案,動態配置用 C(),跨請求共享用持久化。