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
相关产品推荐
相关产品推荐

