set_include_path() 讓你在執行期動態調整 PHP 尋找 include/require 檔案的目錄,極大提升專案結構靈活性。本文深入解析原理、常見用法、Typecho 實戰案例與避坑指南。
| 函式/常數 | 說明 |
|---|---|
set_include_path(string $path) | 設定包含路徑,回傳舊路徑;失敗回傳 false |
get_include_path() | 取得目前包含路徑字串 |
PATH_SEPARATOR | 系統路徑分隔符(Linux/Mac: :,Windows: ;) |
__FILE__ | 目前執行腳本的完絕對路徑(含檔名) |
dirname($path) | 取得路徑的目錄部分(去除檔名) |
<?php
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__)); // 專案根目錄
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins'); // 相對路徑
// 將根目錄/var 與 根目錄/usr/plugins 加入包含路徑
set_include_path(
get_include_path() . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . '/var' . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__
);
?>
dirname(__FILE__) 取得 config.inc.php 所在目錄 → 專案根目錄get_include_path() 保留原有路徑(含 PEAR、系統預設)PATH_SEPARATOR 串接新路徑,跨平台相容include 'Widget/Archive.php' 即可自動從 /var 或 /usr/plugins 尋找/inc 移至 /include未用 set_include_path:需修改所有檔案的 include('/inc/sql.php') → include('/include/sql.php')
用 set_include_path:僅在啟動檔(如 config.inc.php)加一行:
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/include');
所有 include('sql.php') 自動生效,零修改業務碼。
路徑由左至右搜尋,越前面優先級越高。若同名檔案存在於多個目錄,先找到的會被載入。
__DIR__ (PHP 5.3+) 等同 dirname(__FILE__),更簡潔。opcache、classmap (Composer) 優化載入。// ❌ 錯誤:未保留原路徑,導致系統函式庫找不到
set_include_path('/my/custom/path');
// ✅ 正確:附加模式
set_include_path(get_include_path() . PATH_SEPARATOR . '/my/custom/path');
新專案強烈建議使用 Composer 自動載入,完全取代手動管理 include_path:
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Plugin\\": "usr/plugins/"
}
}
}
執行 composer dumpautoload -o 產生最佳化對照表,include 'vendor/autoload.php' 即可全專案免 include/require。
set_include_path() 是舊專案、插件系統、無 Composer 環境下的利器,核心價值在於集中管理、動態調整、跨平台相容。現代專案請優先採用 PSR-4 自動載入,架構更清晰、效能更優、工具鏈支援更完整。
相關專題:《PHP 面向對象程序設計入門教程》、《PHP 陣列操作技巧大全》。