不同於其他語言以「當前腳本目錄」為基準,PHP 的相對路徑基於當前工作目錄(CWD)。在包含文件鏈(A include B,B include C)中,CWD 可能是入口腳本目錄,導致 B、C 中的相對路徑失效。這是無數 PHP 開發者踩過的坑。
統一採用 dirname(__FILE__)(PHP 5.3+ 推薦 __DIR__)構建絕對路徑,徹底消除 CWD 不確定性。
b.php ← 與根目錄同級
根目錄/
├── a.php
├── c.php
└── dir/
└── d.php
<?php
// a.php
include_once(dirname(__FILE__) . '/../b.php'); // 向上一級訪問 b.php
include_once(dirname(__FILE__) . '/c.php'); // 同級訪問 c.php
?>
<?php
// c.php
include_once(dirname(__FILE__) . '/dir/d.php'); // 基於 c.php 所在目錄構建路徑
?>
在框架入口或公共配置文件定義:
// 定義項目根目錄常量
define('ROOT_PATH', dirname(__DIR__)); // 假設入口文件在 public/ 目錄
// 統一引用方式
include_once ROOT_PATH . '/config/database.php';
include_once ROOT_PATH . '/library/Autoloader.php';
__DIR__ 替代 dirname(__FILE__),語義更清晰、性能微優。include/require,從根源消除路徑問題。| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
include '../config.php' | 入口文件目錄變更即失效 | include __DIR__.'/../config.php' |
require './lib.php' | 被不同目錄腳本包含時路徑錯亂 | require __DIR__.'/lib.php' |
| 在包含文件中用相對路徑包含其他文件 | 鏈式包含必崩 | 全部改為基於 __DIR__ 的絕對路徑 |
dirname(__FILE__) / __DIR__ 是解決 PHP 相對路徑問題的「定海神針」。現代開發應配合 Composer 自動加載、框架路由機制,從架構層面杜絕手動路徑拼接,讓路徑問題成為歷史。