【PHP】__FILE__や$_SERVER[‘SCRIPT_NAME’]等の違い

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

以上です。

カテゴリー: PHP パーマリンク

コメントを残す

メールアドレスが公開されることはありません。