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");

在包含的 fileA.php 中,我使用dirname(__FILE__).

如果我直接调用 fileA.php 的函数,我会得到正确的路径。但是,如果我在fileB.phpfileC.php中调用它(在包含之后),我会得到错误的路径,...等等!

如何获取包含文件的目录?

注意: dir0(root) 的名称可能会改变,所以我不想对这些路径使用静态字符串!

4

2 回答 2

3

你不会走错路。

Aninclude使被调用文件成为调用它的脚本的一部分,但它不会更改 PHP 指向的路径。所以如果你调用fileAfrom dirB,PHP 仍然在dirB.

但是你知道 dirA(否则你不能包含 fileA),所以chdir("../dirA/dirA.1/dirA.1.1/")将 PHP 指向 dirA,即使是从 fileB 或文件 C。

您可以考虑从dir0. 调用 fileBdirB/fileB.php并包含 fileA include "dirA/dirA.1/dirA.1.1/fileA.php"。在这种情况下,您始终知道您在树中的位置:在 dir0 中。

编辑 我错了。如果dirname(__FILE__);从包含的 fileA 调用,它返回 fileA 的路径。因此,您在 fileA 顶部所要做的就是:

$mypath=dirname(__FILE__);
function myfunction($path){
    echo $path;
    }

并在 fileB 中调用您的函数,同时传递 $mypath:

 myfunction($mypath);

请注意,您可能需要对斜杠和反斜杠进行一些摆弄,具体取决于您的服务器运行的系统。

于 2014-04-16T10:14:33.883 回答
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());
于 2022-02-15T21:32:44.787 回答