この記事は、平成30年4月8日に修正、加筆致しました。
PHPで、include したファイルを include した時、ファイルパスをどうすべきでしょうか。
基本は、最初に実行されたファイルからの相対パスか、絶対パスで指示します。
例として、下図のディレクトリ構成の時、
a.php 内で、フォルダ 2 の b.phpをinclude し、
そのb.php 内で、c.php (2) をincludeしたいとします。
下図の例では、b.php 内の include のパス指示は、a.php からの相対パスになります。
ファイルの内容
1 2 3 4 5 6 7 8 9 10 11 |
a.php の内容 include('2/b.php'); b.php の内容 (例1) include('../2/3/c.php'); b.php の内容 (例2) include('3/c.php'); b.php の内容 (例3) include('./3/c.php'); |
なので、c.php (2) を include したければ、(例1)のようにします。
(例2)(例3)にすると、c.php (1) を include してしまいます。
ここからちょっとややこしいのですが、もし c.php (1) が存在しなければ、(例2)では、c.php (2) を include します。
そして、(例3)では、指定した場所にファイルがないとして warning を発行します。
この動作は、PHPマニュアルに下記のように書いてあリます。
「ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。 ファイルが include_path に見つからないときは、include は呼び出し元スクリプトのディレクトリと現在の作業ディレクトリも探します。 include は、ファイルを見つけられない場合に warning を発行します。」
要するに、(例2)では、呼び出し元スクリプトのディレクトリにファイルがなかったので作業ディレクトリを探して c.php (2) を include したということです。
で、実際の使用では b.php をどこから include しても c.php (2) を include したいことが多いと思います。
なので、多くのサイトで書かれている下記のように書くのが良いと思います。
1 2 3 |
b.php include(dirname(__FILE__) . '/3/c.php'); //PHPのバージョンが5.3.0より前 include(__DIR__ . '/3/c.php'); //phpのバージョンが5.3.0以降のみ |
上の例を説明すると、b.php が存在しているディレクトリの絶対パスを取得して、c.php (2) のパスを絶対パスで指示するようにしています。
勘違いしいやすいのは、a.php が存在しているディレクトリではなく、b.php が存在しているディレクトリの絶対パスだということです。
ここでの絶対パスとは、フルパスの事で、ドキュメントルート(サイトルート)からのパスではありません。(cron で実行するのであれば、これは重要です。)
※上記動作はPHP 5.6.30 で確認しておりますが、PHP 7.1.2 で確認したところ、(例1)(例2)で、c.php (2) を include し、(例3)で、c.php (1) を include します。
また、c.php (1) が存在しない時は、(例1)(例2)で、c.php (2) を include し、(例3)で、warning を発行します。
include_path も確認しましたが、パスは通しておらず、理由はわかりません。
4 個のコメント
php: PHPでincludeの時、ファイルパスの指示の仕方。 | WEBデザイン&WEBプログラミング -sei2の日記- http://t.co/EQtcvck45t
PHPでincludeの時、ファイルパスの指示の仕方。 | WEBデザイン&WEBプログラミング -sei2の日記-
PHPで、include したファイルを include した時、ファイルパスをどうすべきでしょうか… http://t.co/9EnpRFkwoO
最後のb.phpって
include(__DIR__ . ‘/3/c.php’); //phpのバージョンが5.3.0以降のみ
が正しい?
ご指摘ありがとうございます。早速、5年半かけて修正致しました。