推薦寫法
<?php
// 入口檔案 (index.php) 或共用設定檔
define('BASE_PATH', str_replace('\\', '/', realpath(dirname(__FILE__) . '/../')));
?>
逐層解析
__FILE__:當前檔案絕對路徑
dirname(__FILE__):當前檔案所在目錄
... . '/../':往上一層 (專案根目錄)
realpath():解析相對路徑、符號連結,回傳標準化絕對路徑
str_replace('\\', '/', ...):Windows 反斜線統一為正斜線,跨平台相容
常見變體
<?php
// PHP 5.3+ 可用 __DIR__ 替代 dirname(__FILE__)
define('BASE_PATH', str_replace('\\', '/', realpath(__DIR__ . '/../')));
// 若入口檔即在根目錄
define('BASE_PATH', str_replace('\\', '/', realpath(__DIR__)));
// 子目錄再往上兩層
define('BASE_PATH', str_replace('\\', '/', realpath(__DIR__ . '/../../')));
?>
使用範例
<?php
require BASE_PATH . '/config/database.php';
include BASE_PATH . '/lib/functions.php';
// Windows: D:/www/project/
// Linux: /var/www/project/
?>
為何不直接用 $_SERVER['DOCUMENT_ROOT']?
- 虛擬主機/子目錄部署時
DOCUMENT_ROOT 指向公開目錄,非專案根目錄
- CLI 模式下
$_SERVER['DOCUMENT_ROOT'] 不存在
BASE_PATH 由檔案位置決定,不受 Web 伺服器配置影響