在 PHP 專案中,取得網站根目錄的實體絕對路徑是載入設定檔、引入類庫、寫入日誌的基礎。本文整理三種主流做法,說明適用場景與優缺點。
define('WWWROOT', str_ireplace(
str_replace('/', '\\', $_SERVER['PHP_SELF']),
'',
__FILE__
) . '\\');
PHP_SELF) 從絕對檔案路徑 (__FILE__) 中移除,得到根目錄。define('WWW_PATH', str_replace('\\', '/', realpath(dirname(__FILE__) . '/../')));
__FILE__ → 所在目錄 → ../ 回專案根目錄 → realpath() 解析絕對路徑並統一分隔符。realpath() 自動解析符號連結。/../ 層數需依專案結構調整 (如 public/index.php 則為 /../,public/api/v1/index.php 則為 /../../../)。$root = $_SERVER['DOCUMENT_ROOT']; // 例如 /var/www/html 或 C:/inetpub/wwwroot
// public/index.php
define('ROOT_PATH', realpath(__DIR__ . '/../'));
ROOT_PATH,避免重複計算與不一致。vendor/autoload.php 所在目錄推導:realpath(__DIR__ . '/../../')。| 方法 | PHP 版本 | CLI 可用 | 符號連結安全 | 推薦度 |
|---|---|---|---|---|
| __FILE__ + PHP_SELF | ≥ 4.0 | 否 | 否 | ★ |
| dirname + realpath | ≥ 5.3 | 是 | 是 | ★★★ |
| DOCUMENT_ROOT | ≥ 4.0 | 否 | 視設定 | ★★ |
採用「入口檔定義 ROOT_PATH + realpath」模式,是現代 PHP 專案 (Laravel, Symfony, ThinkPHP, 原生) 的標準作法。