PHP include時のパス解決方法
PHP |
PHP Hypertext Preprocessor 掲載記事一覧 | ||
1 | PHP include時のパス解決方法 | includeやrequireで読み込み対象とするパスはプログラムから設定できます。 |
require_onceの対象パス解決方法
include(include_once, require, require_onceも同様)で相対パス指定をすると、実行したファイルからの相対パスとなるため、複数ファイルからincludeされるPHPファイルでさらにincludeする場合などではパスが予測できないことがよくあります。ここでは、パスの解決方法について2通りのやり方を紹介します。最後にどちらのパス解決を選んだ方がいいかをコメントしています。
- dirname(__FILE__)を使用してパス解決
__FILE__を使用し、実行ファイルではなく実際にincludeを記述するファイルからの相対パス指定を行う方法です。 - プログラム中で include path を設定することでパス解決
include path に基準とするパスを指定する方法です。
(1) dirname(__FILE__)を使用してパス解決
解決策の1つとして dirname(__FILE__)
を使用する方法があります。 __FILE__ を使うと __FILE__ を記述した PHPファイル の絶対パスが得られます。 dirname はファイルからディレクトリ名のみを抜き出す関数で、 dirname(__FILE__) は現在参照中の PHPファイル が置かれているディレクトリへの絶対パスということになります。
これを使えばコードを記述中の PHPファイル の位置をパス解決の基準にすることができます。例えば /test/php_include/base/index.php というファイルをコーディングしていて、 /test/php_include/inc/include.php というファイルを include_once で参照したいとします。この場合、次のコードで確実に参照できます。
include_once(dirname(__FILE__).'/../inc/include.php');
(2) プログラム中で include path を設定することでパス解決
解決策の2つ目は include_path 関数であらかじめ基準とするパスを設定する方法があります。 include_once等 で 外部PHPファイル を参照する場合、 PHP は include path に設定されたディレクトリを基準にパス解決を試みます。
例えば /test/php_include/ を基準にしたいのであれば、 include_once等 の関数を呼び出す前( include_once等 を呼び出す PHP とは別で問題ありません) に次のコードを書いておきます。
set_include_path(get_include_path().PATH_SEPARATOR.'/test/php_include';
1度このコードを通過していれば、 /test/php_include/inc/include.php というファイルを include_once で参照したい場合は、 include_once('inc/include.php');
というように include path に設定したディレクトリからの相対パスを指定するだけで参照できます。
set_include_path は include path を設定するための関数で、 get_include_path は現時点の include_path の設定値を取得する関数です。 PATH_SEPARATOR は複数パスを指定したい場合の区切り文字として使用する定数です。
set_include_path関数 に get_include_path() を渡しているのは、 include path は php.ini でも設定できることと、他に PHP 中で include path を設定していた場合にそれらを消してしまわないためです。 (仮に消してしまっても php.ini まで書き変わるわけではないので慌てることはありませんが・・)
パス解決方法の選び方
パス解決方法(1)の特徴
パス解決方法(1)では include等 を呼ぶたびに現在参照中の PHPファイル のパスを確認し、そこからの相対パスで PHPファイル を参照します。そのため include等 を記述する PHPファイル とこれから参照する PHPファイル の位置関係が変わらないことが大前提になります。また、毎回自分のファイルがどこのパスに位置しているのかを求める必要があるため、何度も呼び出されるとわずかですが負荷は高くなります。
パス解決方法(2)の特徴
パス解決方法(2)は、あらかじめ include path を設定しておき、そこからの相対パスで PHPファイル を参照します。1度 include path を設定しておけば、その PHPプログラム を実行している間は設定が有効であるため、パス解決方法(1)の様に何度も自分のファイル位置を求める必要がなく効率のいいパス解決ができます。現在参照中の PHPファイル の位置も関係ないため、これから参照する PHPファイル の場所が決まっていれば、現在参照中の PHPファイル との位置関係は関係ありません。
ただし、もともとのinclude pathに新しい値を設定する方式なので、何度もset_include_pathを呼び出してしまうと同じパスを複数追加していくことになり、あまり好ましくありません。SVCモデルの様に1つのPHPファイル(SVCの"Controller")で処理を受け付け、内部で適宜分岐するといったようなモデルを採用しているなら効果的だと思います。
パス解決方法(1)と(2)を組み合わせた方法
そもそも、インクルードする PHPファイル の置き場所(絶対パス)が完全に決まっているなら php.ini に書いておけばこの問題は解消するのですが、 SVCモデル を採用していてかつ Controler とインクルードする PHPファイル が置かれているディレクトリの位置関係が決まっているなら、php.ini に設定を記述することなく、(1)と(2)とを組み合わせるだけでパス解決が行えます。
Controller に相当する PHPファイル ( 仮に controller.php ) が /test/php_include/ に配置されているなら、 controller.php に以下のコードを書いておけば、 controller から呼び出されるPHPは全て 「include_once ( Controllerからの相対パス )」
でファイルを参照することができます。
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
以上です。
includeパス の解決といっても方法はいくつかあるので、必要に応じて適切なアプローチを選択しましょう。
言語・環境 |
Java |
総称型(Generics) |
JFace |
Servlet/JSP |
ResponseWrapper処理の流れ |
PHP |
includeパス解決方法 |
Objective-C |
Cocoa |
Excel関数 |
目的別 |
PR |
検索 |