PHPでスクリプトを書いていると、絶対パスやら相対パスを取得することが多々あります。
PHPの定数やグローバル変数には、それらのパスを返すものがあるのですが、若干、ややこしいです。そこで、少しまとめてみました。
なお、以下の例は、CORESERVERでの結果を表示しています。
■ まず、定数から。
__FILE__
これは、「__FILE__」が記述されたファイルそのものの絶対パスを返します。インクルードされるファイルならそのファイルです。
例:/virtual/account/public_html/examle.com/foo/bar.php
次に、
dirname(__FILE__) 又は __DIR__
これは、「dirname(__FILE__)」が記述されたファイルのディレクトリまでの絶対パスを返します。最後はスラッシュは付かないです。
例:/virtual/account/public_html/examle.com/foo
■ ここからは、$_SERVER変数です。
$_SERVER['SCRIPT_FILENAME']
現在実行しているスクリプトの絶対パス。__FILE__とは異なり、全体としての実行ファイルの絶対パスを指しします。
例:/virtual/account/public_html/examle.com/foo/filename.php
__FILE__は、それが記述されたファイル名であり、インクルードされるファイルであるならそのインクルードされるファイルを指します。
これに対し、$_SERVER[‘SCRIPT_FILENAME’]は、URL(と同等とも言うべき)の絶対パスを返します。つまり、インクルードする側のファイル名です。
なお、mod_rewriteでURLの読み替えを行っていても、読み替え前の素のファイル名を返すので注意が必要です。
$_SERVER['SCRIPT_NAME']
これは、現在のスクリプトのパス。ドメイン下のディレクトリからファイル名までのパスとなります。?以後のパラメーターがつく場合には、その部分は無視します。
なお、mod_rewriteの場合は、読み替え前のファイルです。
例:/foo/filename.php
$_SERVER['PHP_SELF']
これは、現在実行しているスクリプトのファイル名です。$_SERVER[‘SCRIPT_NAME’]とほぼ同じです。ただし、?以後にパラメーターが付く場合、そのパラメーターも表示してしまいXSSの脆弱性につながるとのこと。
例:/foo/filename.php
つまり、パラメーター部分にJavaScriptを仕込まれると、ブラウザ上で実行してしまう危険性があるというわけです。使う場合には、htmlspecialchars等でサニタイズすることが必要とのこと。
■ require_once()について
require_once()
最後に、ファイルを読み込む処理の方である、require_once()についてですが、これは、require_once()が実行されるファイル全体を起点として、ファイルの読込を行います。
そのため、ディレクトリ階層が違う複数のファイルからインクルードされる特定のファイルにおいて、require_once()をする場合には注意が必要です。
その場合には、一度、__FILE__を利用して絶対パスに修正してから使います。
$path = dirname(__FILE__).'/../../../data/init.php'; require_once($path);
なお、../の付いた相対パスだと見づらい場合には、realpath()関数で正規の絶対パスに変更することも可能です。
$path = realpath(dirname(__FILE__).'/../../../data/init.php');
以上です。