1. HOME
  2. 開発・ブログ運営
  3. PHP
  4. PHP で 外部ファイルを include したり require する場合は 絶対パスで指定するべきなんだって
2012年04月27日
iTunes Search API を使って iTunes S ...
2012年07月24日
PHP5 で RSS フィードを読み込んで表示するために、とて ...
2012年10月16日
10分で出来た!OAuth と PHP でつくる Twitte ...
2016年07月31日
Docker 公式イメージで立ち上げた PHP-FPM コンテ ...
2013年03月28日
エックスサーバーで 500 Internal Server エ ...
2012年05月06日
iOS, Mac OS X アプリ検索 & ブログ用 ...

PHP で 外部ファイルを include したり require する場合は 絶対パスで指定するべきなんだって

PHP で 外部ファイルを include (または require )する場合は、絶対パスで指定??それとも相対パスで指定??どうやら、絶対パスが良い(らしい)。

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 する場合は、

ふたつ下の階層の PHP ファイルを include する場合は、

で、include できます。

ってことで、include 関連のエラーが出た場合には、一度パスを見なおしてみると良いかもしれません。

でわでわ。








この記事にコメントする





Copyright © 2012 - 2014 MacBook Air とWordPressでこうなった All rights reserved
Powered by WordPress.