web codery

【PHP】include, requireの安全なパスの書き方と違い

category: PHP

include, require文は、PHPで他のファイルを読み込むときに使う構文です。今回は、それらの文に指定する絶対・相対それぞれでの安全なパスの書き方とパスの書き方による違い、最後に変数の扱いについても簡単に触れておきます。
挙動の違いなどについては、include, requireの違いと使い分けを参照してみてください。

目次

  1. 絶対・相対それぞれの安全なパスの書き方
  2. パスの書き方での違い
  3. 変数のスコープ

絶対・相対それぞれの安全なパスの書き方

まずは結論を書きます。なお、includeとrequireは、構文・パスの書き方などほとんどの点で違いがないので、以下ではincludeでコードを書いていきます。

相対パスでの指定方法

include(dirname(__FILE__) . '/path/file_name.php');

dirname(__FILE__)は、そのファイルが置かれたディレクトリのパスになります。なので、そこからの相対パスをその後につなげて読み込むファイルを指定します。

ドメイン直下からの絶対パスでの指定方法

include($_SERVER['DOCUMENT_ROOT'] . '/path/file_name.php');

$_SERVER[‘DOCUMENT_ROOT’]はドキュメントルート(URLでいうとドメイン直下)のパスになるので、これでドメインからの絶対パス指定になります。

パスの書き方での違い

なぜ上で書いたような手の込んだパス指定をするのかというと、絶対パスではドキュメントルートからの指定にはならず、相対パスではincludeを書いたphpからのパス指定にならない場合があるからです。ということで、各指定方法でのパスの解釈について書いていきます。

絶対パスで指定した場合

include('/path/file_name.php');

上の書き方をすると、サーバのルートからの指定になります。サーバのルートからみたドキュメントルートのパスは、たとえば「/var/www/html」のようになり、これはサーバ側の設定によって変わります。なのでこれはドメイン直下からの指定とは全く違うパスになってしまいます。ドキュメントルートの位置が変わらない(設置するサーバを変えない、設定も変えないなど)場合は、もちろんこれで問題ありません。

相対パスでの指定方法

include('../path/file_name.php');

上の指定の場合、一つ上の階層のpathディレクトリにあるfile_name.phpを読み込むわけですが、そのパスの起点は最終的に実行されたファイルからパスになります。なので、上のincludeを書いたphpファイルがさらに他のphpに読み込まれて実行された場合、最終的に実行したファイルの位置によってパスが変わってしまうことになります。

頭に何もつけずにパスを指定した場合

include('path/file_name.php');

この指定方法では、php.iniのinclude_pathで設定したディレクトリ下のpathディレクトリからfile_name.phpを探します。(そこに、file_name.phpが無ければ呼び出し元ファイルのディレクトリも探す)include_pathを設定できる場合は、include_pathを設定してそこからのパスを上のように指定する方法もあります。また、サーバの設定でPHPからのinclude_path変更を許可している場合は、set_include_pathもしくはini_setを使ってPHP内で設定する方法もあります。

set_include_path('/home/username/public_html/include');
ini_set('include_path', '/home/username/public_html/include');

変数のスコープ

最後に、include, requireしたときの変数のスコープについてです。その場合の変数のスコープは、読み込み側ファイル中の読み込まれた位置のスコープになります。要するに、includeされたファイルがincludeした位置に単純に展開されるので、読み込まれたファイル, 読み込み側ファイルで定義された変数を双方で使うことができます。

以上、include, requireの安全なパスの書き方と違いについてでした。

参考サイト
PHP: include – Manual

管理人にメッセージを送る





ページトップ