萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP __FILE__ 魔術常數完整指南:取得檔案路徑、目錄與跨平台相容處理

什麼是 __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__);

PHP 5.3+ 更好的替代方案:__DIR__

<?php
echo __DIR__;          // 等同 dirname(__FILE__)
echo __DIR__ . '/config.php'; // 直接串接

優點:語意更清晰、少一次函式呼叫、效能略優、程式碼更易讀。

跨平台路徑處理最佳實踐

1. 使用 DIRECTORY_SEPARATOR 常數

$path = __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'db.php';

2. 善用 realpath() 正規化路徑

$absPath = realpath(__DIR__ . '/../config'); // 解析相對路徑、統一斜線方向

3. 現代框架的基礎路徑定義


// Laravel 風格
define('BASE_PATH', realpath(__DIR__ . '/../'));
define('APP_PATH', BASE_PATH . '/app');
define('CONFIG_PATH', BASE_PATH . '/config');

常見陷阱與注意事項

  1. 符號連結:__FILE__ 回傳**解析後的真實路徑** (已解析 symlink),若需原始路徑請用 $_SERVER['SCRIPT_FILENAME']。
  2. PHAR 封裝:在 PHAR 封裝檔中,__FILE__ 為 phar://... 格式。
  3. Windows 路徑大小寫:Windows 不分大小寫,但 Linux 分大小寫,部署時務必統一。
  4. 編碼問題:中文路徑在 Windows PHP 舊版本可能顯示亂碼,建議路徑僅用 ASCII。

實用工具函式

// 取得專案根目錄 (假設此檔在 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;
    }
}
copyright © 萬盛學電腦網 all rights reserved