
PHP 開発をしてると外部ファイルを include したり require する場面は多々ある訳ですが、include なりをする外部ファイルを指定するためには、サーバー上での絶対パスで指定してあげるべき、だそうな。
なぜ?
実際に、相対パスでもちゃんと include(または require )できるし、PHP の言語仕様的には、相対パスで全然おっけーなはず。
参考:PHP: include – Manual
参考:PHP: include_once – Manual
参考:PHP: require – Manual
参考:PHP: require_once – Manual
(以下、include_once でも require でも require_once でも同じです)
っで、いつも通りググってみた訳ですが、どうやら、
include する場合は 大元の include の呼び出し元が相対パスの起点になるから、みたい。ようは、include されるファイルの中で、またさらに別のファイルを include するような場合に問題がある。
例えば、hoge1.php から /dir/hoge2.php (別階層のphp)をインクルードして、さらに /dir/hoge2.php から /dir/hoge3.php がインクルードされてる場合に、これら全ての include が、相対パスで書かれているような場合。
ブラウザから直接 /dir/hoge2.php にアクセスがあった場合にはちゃんと /dir/hoge3.php がインクルードされるんだけど、ブラウザから hoge1.php にアクセスがあると /dir/hoge2.php まではインクルード OK でも /dir/hoge2.php から /dir/hoge3.php をインクルードするときにエラーになる。
なぜなら、hoge1.php から順々に include されていくので、全ての include パスの起点が、大本の呼び出し元(ブラウザでのアクセス場所)である、hoge1.php になるので、/dir/hoge2.php が /dir/hoge3.php を呼び出すところでエラー。
なので、WordPress のように色々なファイルで、include や require をしまくってるライブラリ(API)を使う場合は、絶対パスで指定しておかないと、ちゃんとインクルード出来ない場合がある、ってことなんだと理解しました。
テンプレートファイルなど、WordPress 内部の PHP ファイルだと相対パスでも大丈夫なような気がしますが、WordPress 外部から WordPress のファイルを include する場合は絶対パスにしておけば安心かと。
ってことで、私の場合は、WordPress の内部だろうが外部だろうが、WordPress の関数群を使う PHP では、include(または require )する場合は、つねに絶対パスで指定するようにしときます。
そうすれば安心。
絶対パスでの include または require のしかた
dirname(__FILE__)を使用してパス解決する方法と、プログラム中で include path を設定することでパス解決する方法の2通りあるみたい。
もちろんベタ書きでも構いませんが・・。
その違いや使い分けなんかは、以下のページが詳しいので割愛。
参考: PHP include時のパス解決方法 – profaim.jp
私は、dirname(__FILE__) しか使ったことがありませんが、例えば、一つ上の階層の PHP ファイルを include する場合は、
include( dirname(__FILE__).'/php/hoge.php' );
ふたつ下の階層の PHP ファイルを include する場合は、
include( dirname(__FILE__).'/../../hoge.php' );
で、include できます。
ってことで、include 関連のエラーが出た場合には、一度パスを見なおしてみると良いかもしれません。
でわでわ。