You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何在被包含文件中获取调用文件所在父目录的basename?

如何在被包含文件中获取调用文件的父目录名称?

问题场景

你的目录结构和代码如下:

  • public_html/includes/includeMe.php:
    <?php echo basename(__DIR__); ?>
    
  • public_html/stuff/myPage.php:
    <?php include '../includes/includeMe.php'; ?>
    

访问stuff/myPage.php时,当前输出为includes,但你期望输出调用文件所在的父目录名stuff,且不能将输出逻辑移至myPage.php。

解决方案

可以通过以下两种方式在includeMe.php中实现需求:

方案1:使用$_SERVER['SCRIPT_FILENAME'](推荐,性能更高)

$_SERVER['SCRIPT_FILENAME']保存的是当前执行的入口脚本的完整路径,直接基于它处理即可:

<?php
// 获取入口脚本的完整路径
$entryScript = $_SERVER['SCRIPT_FILENAME'];
// 提取脚本所在目录,再取目录名的最后一部分
echo basename(dirname($entryScript));
?>

执行逻辑:$_SERVER['SCRIPT_FILENAME']返回public_html/stuff/myPage.php,dirname()得到public_html/stuff,basename()最终提取出stuff。

方案2:使用debug_backtrace()(灵活,适配多层包含场景)

如果存在多层包含嵌套,debug_backtrace()可以获取完整调用栈,精准定位直接调用当前文件的脚本:

<?php
$callingFile = '';
// 遍历调用栈,找到非当前文件的调用源
foreach (debug_backtrace() as $trace) {
    if (isset($trace['file']) && $trace['file'] !== __FILE__) {
        $callingFile = $trace['file'];
        break;
    }
}
// 提取调用文件的父目录名
echo basename(dirname($callingFile));
?>

执行逻辑:遍历调用栈记录,找到第一个不是includeMe.php的文件路径(即myPage.php),后续处理同方案1。

说明

  • 方案1性能更优,适合绝大多数单入口或简单包含场景;
  • 方案2更灵活,当存在多层包含(如A包含B,B包含includeMe.php)时,能准确获取直接调用者的目录。

内容的提问来源于stack exchange,提问作者Glen Keybit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:00:39