__FILE__?__FILE__ 是 PHP 九大魔術常數之一,**編譯時解析**,代表「目前執行腳本的完絕對路徑」(含檔名)。若在 include 檔案中使用,回傳的是**被 include 的那個檔案路徑**,而非主程式路徑。
<?php
echo __FILE__;
// 輸出範例 (Windows): C:\xampp\htdocs\project\config.php
// 輸出範例 (Linux): /var/www/html/project/config.php
dirname(__FILE__) 取得目錄<?php
echo dirname(__FILE__);
// 輸出: C:\xampp\htdocs\project (不含尾端斜線)
這是**取得目前腳本所在目錄**的標準寫法,常用於:
require dirname(__FILE__) . '/lib/db.php';$baseDir = dirname(__FILE__);__DIR__<?php
echo __DIR__; // 等同 dirname(__FILE__)
echo __DIR__ . '/config.php'; // 直接串接
優點:語意更清晰、少一次函式呼叫、效能略優、程式碼更易讀。
DIRECTORY_SEPARATOR 常數$path = __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'db.php';
realpath() 正規化路徑$absPath = realpath(__DIR__ . '/../config'); // 解析相對路徑、統一斜線方向
// Laravel 風格
define('BASE_PATH', realpath(__DIR__ . '/../'));
define('APP_PATH', BASE_PATH . '/app');
define('CONFIG_PATH', BASE_PATH . '/config');
__FILE__ 回傳**解析後的真實路徑** (已解析 symlink),若需原始路徑請用 $_SERVER['SCRIPT_FILENAME']。__FILE__ 為 phar://... 格式。// 取得專案根目錄 (假設此檔在 src/Utils/Path.php)
function projectRoot(): string {
return realpath(__DIR__ . '/../../');
}
// 安全引入檔案
function safeRequire(string $relativePath): void {
$file = realpath(__DIR__ . '/' . $relativePath);
if ($file && strpos($file, realpath(__DIR__)) === 0) { // 防止目錄遍歷
require $file;
}
}