首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP require/include 路徑問題徹底解析與最佳實踐

     編輯:PHP 相關知識

三種路徑類型

類型格式範例解析基準
相對路徑以 . 開頭./a.php, ../config.php**腳本執行入口檔案所在目錄**(無論包含巢狀深度)
絕對路徑以 / 或盤符開頭/var/www/a.php, C:/www/a.php直接定位檔案系統,不受任何參考目錄影響
未確定路徑不以 .、/、盤符開頭a.php, lib/config.php先搜尋 include_path,再搜尋**執行 require 語句的檔案所在目錄**

相對路徑陷阱實測

假設入口 A.php 在 /app/test/:

A.php: require './b/b.php';   // 載入 /app/test/b/b.php
B.php: require './c.php';     // 載入 /app/test/c.php  (非 /app/test/b/c.php)

所有相對路徑**永遠以入口檔目錄為基準**,這是最常見的誤區。

絕對路徑與 __DIR__ 魔術常數

// B.php 內
require __DIR__ . '/c.php';          // 永遠載入 B.php 同目錄下的 c.php
require __DIR__ . '/../c.php';       // 永遠載入 B.php 上層目錄的 c.php
require __DIR__ . '/sub/c.php';      // 永遠載入 B.php 同層 sub/ 目錄下的 c.php

__DIR__(等同 dirname(__FILE__))在編譯期解析為**該檔案所在目錄的絕對路徑**,與是否被包含無關,極其可靠。

未確定路徑的解析順序

  1. 遍歷 include_path(php.ini 或 set_include_path() 設定),拼接路徑查找。
  2. 若未找到,以**執行 require 語句的檔案目錄**為基準拼接查找。
  3. 仍找不到則拋出錯誤。

行為不直觀,強烈建議**避免使用**。

最佳解決方案

方案一:統一使用 __DIR__ 建構絕對路徑

// config/bootstrap.php
define('APP_ROOT', __DIR__ . '/../');
// 其他檔案
require APP_ROOT . 'lib/Database.php';

方案二:Composer 自動載入(現代標準)

// composer.json
{
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}
// 入口檔唯一 require
require __DIR__ . '/vendor/autoload.php';

類別對應檔案路徑,零配置、效能佳、符合 PSR-4 標準。

方案三:自訂 import() 輔助函式(舊專案相容)

function import($path) {
    $old = getcwd();
    chdir(dirname(__FILE__));
    require_once $path;
    chdir($old);
}
// 使用
import('../lib/Helper.php'); // 以 import 所在檔案為基準

總結建議

  • 新專案:採用 Composer + PSR-4,完全避開手動 require。
  • 舊專案重構:逐步替換為 __DIR__ 絕對路徑。
  • 禁用未確定路徑,關閉 allow_url_include 提升安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved