include dirname(__FILE__).'/../../index.php';
ここが最善の策であり、他のソリューションで発生する可能性のある相対パスのバグのほとんどを回避できます。
実際、これにより、インクルードは常に、このコードが配置されている現在のスクリプトの位置(アプリケーションのアーキテクチャを定義しているため、この位置が最も安定している可能性が高い)に対して相対的になります。これは、実行中の( "calling"とも呼ばれる)スクリプトに相対的に、現在の作業ディレクトリに相対的に含めるだけの場合とは異なりinclude '../../index.php'
ます。、含まれるスクリプトのパスから解決するのではなく、スクリプトを含む親スクリプトを指します。 。
PHPのドキュメントから:
ファイルは、指定されたファイルパス、または指定されていない場合は指定されたinclude_pathに基づいてインクルードされます。include_pathにファイルが見つからない場合、includeは最終的に、失敗する前に、呼び出し元のスクリプトの独自のディレクトリと現在の作業ディレクトリをチェックインします。
そして、このトリックを引用して私が見つけた最も古い投稿は、Tapkenによる2003年にさかのぼります。
次の設定でテストできます。
次のようなレイアウトを作成します。
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
にparent.php
、次を入れます:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
にsub/included.php
、次を入れます:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
アクセス時の結果parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
ご覧のとおり、最初のケースでは、パスは呼び出し元のスクリプトから解決されますがparent.php
、dirname(__FILE__).'/path'
トリックを使用することによりincluded.php
、コードが配置されているスクリプトからインクルードが行われます。
次の点は、他の場所で読み取れるものとは異なり、上記のトリックと同等ではありません。
include '/../../index.php';
実際、プリペンド/
は機能しますがinclude ../../index.php
、呼び出し元のスクリプトと同じように解決されます(違いは、include_path
失敗した場合、後で調べられないことです)。PHP docから:
絶対パス(Windowsではドライブ文字または\で始まる、Unix / Linuxシステムでは/で始まる)または現在のディレクトリからの相対パス(。または..で始まる)が定義されている場合、include_pathは完全に無視されます。