從 Windows (IIS) 遷移到 Linux (Apache/Nginx) 時,include("文件名") 相對路徑常失效。本文解析 dirname(__FILE__) 解決跨平台包含路徑的原理與最佳實踐。
include("config.php") 正常工作Linux 下 Web 根目錄通常為 /home/web/,相對路徑基於執行腳本所在目錄而非包含文件所在目錄。多層包含時工作目錄發生變化,導致路徑解析錯誤。
<?php
// 當前文件所在目錄絕對路徑
$baseDir = dirname(__FILE__);
// 包含同目錄文件
include $baseDir . '/page.php';
// 包含上級目錄文件
include dirname($baseDir) . '/config.php';
// 多級向上
include dirname(dirname(__FILE__)) . '/lib/common.php';
?>
__DIR__ 等價於 dirname(__FILE__)<?php
// index.php 或 bootstrap.php
define('ROOT_PATH', dirname(__DIR__)); // 項目根目錄
define('APP_PATH', ROOT_PATH . '/app');
define('CONFIG_PATH', ROOT_PATH . '/config');
// ...
include CONFIG_PATH . '/database.php';
require_once APP_PATH . '/models/User.php';
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
// 運行 composer dump-autoload
// 僅需在入口引入
require_once __DIR__ . '/vendor/autoload.php';
include/require 相對路徑改為基於 __DIR__ 或常量open_basedir 限制是否包含項目目錄採用 dirname(__FILE__) / __DIR__ 作為路徑基準,是 PHP 跨平台部署的基礎規範。