PHP 中 __DIR__、__FILE__、getcwd()、$_SERVER['DOCUMENT_ROOT']、realpath() 易混淆。本文逐一釐清適用場景與差異。
| 表達式 | 含義 | 受 Include 影響? | 典型值示例 |
|---|---|---|---|
__DIR__ | 當前**腳本文件**所在目錄 (編譯時確定) | 否 | /var/www/project/src/Controller |
dirname(__FILE__) | 同上 (PHP 5.2-) | 否 | /var/www/project/src/Controller |
__FILE__ | 當前腳本文件完整路徑 | 否 | /var/www/project/src/Controller/User.php |
getcwd() | **當前工作目錄** (執行腳本入口目錄,CLI 為 cd 目錄,Web 為入口腳本目錄) | 是 | /var/www/project/public |
realpath('.') | 同 getcwd(),解析符號鏈接 | 是 | /var/www/project/public |
realpath('..') | 工作目錄的上級目錄 | 是 | /var/www/project |
$_SERVER['DOCUMENT_ROOT'] | Web 服務器配置的**網站根目錄** (Nginx root / Apache DocumentRoot) | 否 | /var/www/project/public |
pathinfo(__FILE__, PATHINFO_DIRNAME) | 同 __DIR__ | 否 | /var/www/project/src/Controller |
// config.php 在項目根目錄 require __DIR__ . '/../../config.php'; // 即使被不同深度文件 include 也準確
// 入口 public/index.php 中 $uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/../storage/uploads'; // 固定項目結構 // 或 $baseDir = dirname(__DIR__); // public/ 父目錄 = 項目根目錄 $uploadDir = $baseDir . '/storage/uploads';
// cron.php 在 /var/www/project/scripts/ $dataFile = __DIR__ . '/data.csv'; // 穩定 // getcwd() 取決於 crontab 執行目錄,不可靠
$scriptDir = dirname($_SERVER['SCRIPT_FILENAME']); // 入口腳本目錄 (如 public/index.php) $currentScriptDir = dirname(__FILE__); // 當前被執行文件目錄 (可能是 include 文件)
__DIR__ 相對路徑,不依賴工作目錄。$_SERVER['DOCUMENT_ROOT'] 或項目根目錄常量 (框架通常定義 BASE_PATH)。define('ROOT_PATH', __DIR__ . '/..'); 供全局使用。./relative/path、getcwd() 拼接業務路徑。