dirname(__FILE__) 完整用法__FILE__:當前執行腳本的完整絕對路徑 (含檔名),符號連結已解析。__DIR__ (PHP 5.3+):等同 dirname(__FILE__),直接取得目錄路徑。dirname(string $path, int $levels = 1):PHP 7.0+ 支援第 2 參數直接取上 N 層目錄。假設檔案位於 D:\www\project\src\config.php:
echo __FILE__; // D:\www\project\src\config.php
echo __DIR__; // D:\www\project\src
echo dirname(__FILE__); // D:\www\project\src
echo dirname(__DIR__); // D:\www\project
echo dirname(__FILE__, 2); // D:\www\project (PHP 7.0+)
echo dirname(dirname(__FILE__)); // D:\www\project (舊寫法)
require_once __DIR__ . '/../vendor/autoload.php';
require_once dirname(__DIR__) . '/config/database.php';
define('ROOT_PATH', dirname(__DIR__));
define('CONFIG_PATH', ROOT_PATH . '/config');
define('PUBLIC_PATH', ROOT_PATH . '/public');
// 使用 DIRECTORY_SEPARATOR 或直接用正斜線 (Windows 也支援)
$path = __DIR__ . '/../storage/logs/app.log';
$path = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . 'app.log';
include_path 搜尋、chdir() 影響、符號連結解析開銷。__DIR__:語意更清晰、少一次函式呼叫。vendor/autoload.php 產生的 ComposerAutoloaderInit 內部已處理路徑,無需手動 dirname。| 誤區 | 正確認知 |
|---|---|
dirname(__FILE__) 回傳含尾斜線 | 不含尾斜線 (Windows 為 \,Linux 為 /),拼接時需自行加上 |
__FILE__ 在 include 檔案中指向主腳本 | 永遠指向「目前正在執行的該檔案」,而非入口腳本 |
使用 $_SERVER['SCRIPT_FILENAME'] 替代 | 該變數指向入口腳本,被 include 的檔案無法取得自身路徑 |
__DIR__ + dirname(..., $levels)// PHP 7.0+ 推薦寫法
$root = dirname(__DIR__, 3); // 向上 3 層
$config = dirname(__DIR__, 2) . '/config';
比多層巢狀 dirname(dirname(...)) 更易讀、效能略優。