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.phpおよびfileC.phpで呼び出すと、間違ったパスが取得されます...など!

インクルードされたファイルのディレクトリを取得するにはどうすればよいですか?

注: dir0(root) の名前は変更される可能性があるため、これらのパスに静的文字列を使用したくありません!

4

2 に答える 2

3

道を間違えることはありません。

Anincludeは、呼び出されたファイルを、それが呼び出されたスクリプトの一部にしますが、PHP が指しているパスは変更しません。したがって、fileAから呼び出すとdirB、PHP はまだ にありdirBます。

しかし、あなたは dirA を知っているので (それ以外の場合は fileA を含めることはできません)、chdir("../dirA/dirA.1/dirA.1.1/")PHP は、fileB やファイル C からでも、dirA を指すことになります。

から作業することを検討できますdir0。で fileB を呼び出し、 で fileA をdirB/fileB.phpインクルードしinclude "dirA/dirA.1/dirA.1.1/fileA.php"ます。その場合、ツリー内のどこにいるかは常にわかります: dir0.

編集 私は間違っていました。インクルードされた fileA から呼び出すとdirname(__FILE__);、fileA のパスが返されます。したがって、fileA の先頭で行う必要があるのは次のとおりです。

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

そして、fileB で $mypath を渡しながら関数を呼び出します。

 myfunction($mypath);

サーバーが実行しているシステムによっては、スラッシュとバックスラッシュをいじる必要があるかもしれないことに注意してください。

于 2014-04-16T10:14:33.883 に答える