PHP获取包含文件的目录路径

3
我有以下PHP文件结构:
dir0
    dirA    
        dirA.1    
            dirA.1.1    
                fileA.php : dirname(__FILE__).'/docs';    
        dirA.2
        ...    
    dirB    
       fileB.php: include_once("../dirA/dirA.1/dirA.1.1/fileA.php");    
    dirC    
       fileC.php: include_once("../dirA/dirA.1/dirA.1.1/fileA.php");

在包含的文件A.php中,我使用dirname(__FILE__)
如果直接调用fileA.php的函数,则可以获得正确的路径。但是,如果在fileB.phpfileC.php等文件(包含后)中调用它,则会得到错误的路径!
如何获取所包含文件的目录?
注意:dir0(根目录)的名称可能会更改,因此我不想为这些路径使用静态字符串!

所以在文件A中定义了一个函数,你在文件B中调用它。在文件B中调用它时,你想要文件A的目录,对吗?你是将文件A包含在文件B中还是其他地方? - Andresch Serj
是的,fileA被包含在许多文件中,例如FileB、FileC等。fileA包含一个“通用函数”,在这个函数中我需要它的目录路径(dir0/dirA/dir1.1/dirA.1.1/docs)。 - Rami.Q
如果FileA有一个函数的定义,它应该只被包含一次。在包含时,您知道路径(否则您无法正确地包含它)。因此,在包含时存储该路径并使用它。 - Andresch Serj
@AndreschSerj,我不确定我是否理解你的意思,但我必须将其包含在我拥有的每个链接的顶部。例如:主页、产品等! - Rami.Q
如果你在文件A中有一个函数 function mypath() { return dirname(__FILE__); },然后在另一个文件B中引入文件A,并在文件B中使用 echo mypath();,它将输出文件A的路径。问题在哪里? - Sharky
显示剩余4条评论
2个回答

3
不要走错路径。 include将被调用的文件包含在其所属的脚本中,但它不会改变PHP所指向的路径。因此,如果您从dirB调用fileA,PHP仍然位于dirB
但是你知道dirA(否则你无法包含fileA),因此chdir("../dirA/dirA.1/dirA.1.1/")将把PHP指向dirA,即使从fileBfileC也是如此。
您可以考虑从dir0开始工作。使用dirB/fileB.php调用fileB,并使用include "dirA/dirA.1/dirA.1.1/fileA.php"包含fileA。在这种情况下,您总是知道自己在树中的位置:在dir0中。 编辑 我错了。 如果您从被包含的fileA中调用dirname(__FILE__);,它将返回fileA的路径。因此,在fileA的顶部所要做的就是:
$mypath=dirname(__FILE__);
function myfunction($path){
    echo $path;
    }

在fileB中,通过传递$mypath调用您的函数:

 myfunction($mypath);

请注意,根据您的服务器运行的系统,您可能需要调整反斜杠和正斜杠。

谢谢你的回答。我知道PHP仍然在dirB中,这就是我的问题所在。但是你的意思是每次调用该函数都必须更改目录吗?天哪,这不是一个好主意。 - Rami.Q

0

这是一个适合使用get_included_files()函数的好例子。该函数将返回一个数字索引数组,其中包含所有已包含的文件。 "获取使用include、include_once、require或require_once包含的所有文件的名称。"
https://www.php.net/manual/en/function.get-included-files.php

您可以像这样获取已包含文件的目录:

array_map("dirname",get_included_files());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接