PHPでincludeの時、ファイルパスの指示の仕方。

この記事は、平成30年4月8日に修正、加筆致しました。

PHPで、include したファイルを include した時、ファイルパスをどうすべきでしょうか。
基本は、最初に実行されたファイルからの相対パスか、絶対パスで指示します。
例として、下図のディレクトリ構成の時、
a.php 内で、フォルダ 2 の b.phpをinclude し、
そのb.php 内で、c.php (2) をincludeしたいとします。
下図の例では、b.php 内の include のパス指示は、a.php からの相対パスになります。

includeパス指示説明図

ディレクトリ構成例

ファイルの内容

なので、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 したいことが多いと思います。
なので、多くのサイトで書かれている下記のように書くのが良いと思います。

上の例を説明すると、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 も確認しましたが、パスは通しておらず、理由はわかりません。

関連記事

カテゴリー:PHP
タグ: , ,

4 個のコメント

  1. Posted 2014年9月11日 at 12:09 AM | Permalink

    php: PHPでincludeの時、ファイルパスの指示の仕方。 | WEBデザイン&WEBプログラミング -sei2の日記- http://t.co/EQtcvck45t

  2. Posted 2014年9月11日 at 12:35 AM | Permalink

    PHPでincludeの時、ファイルパスの指示の仕方。 | WEBデザイン&WEBプログラミング -sei2の日記-

    PHPで、include したファイルを include した時、ファイルパスをどうすべきでしょうか… http://t.co/9EnpRFkwoO

  3. aaaa
    Posted 2015年5月31日 at 1:08 AM | Permalink

    最後のb.phpって
    include(__DIR__ . ‘/3/c.php’); //phpのバージョンが5.3.0以降のみ
    が正しい?

    • sei2
      Posted 2018年4月8日 at 3:14 PM | Permalink

      ご指摘ありがとうございます。早速、5年半かけて修正致しました。

aaaa へ返信する コメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください