PHP の include, require で相対パスを指定して読み込む場合のメモ

2007年 8月 9日 13:48

PHP の inlude や require で他のファイルを相対パスを指定して読み込む場合があります。

特に最近は PHP でもオブジェクト指向な感じでガリガリプログラムを書くことが多いので、細かく class ファイルに分かれたりして、さらに、include, require を活用することになるかと思います。

で、そんな時に問題になりやすいのが、include しているファイルの中で、またさらに別のファイルを include するような場合です。

例えば、次のようなディレクトリ構成で、

www/
|-index.php
|
|-func/
|  |-function.php
|
|-class/
   |-class.php

次のような include を行っていたとします。

www/index.php ファイル

<?php
include("func/function.php");
?>

www/func/function.php ファイル

<?php
include("../class/class.php");
?>

www/class/class.php ファイル

<?php
print("test");
?>

この場合 index.php を実行すると、次のようなエラーが出てしまいます。

Warning: include(../class/class.php) [function.include]: failed to open stream: No such file or directory in www/func/function.php on line 2

function.php の include で指定されている ../class/class.php ファイルが存在しないってことですね。

一件すると、function.php からの相対パス ../class/class.php は問題なさそうですが、PHPでは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」っていう規則があるためエラーとなってしまうのです。
つまり、上記の場合 index.php 実行時のカレントディレクトリは www/ になるため、 www/../class/class.php というファイルを参照しに行って、エラーになってしまうのです。

この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避することができます。具体的には dirname(__FILE__) を使って次のように書きます。

www/func/function.php ファイル

<?php
include(dirname(__FILE__) . "/../class/class.php");
?>

これで、問題無く実行されたかと思います。

__FILE__ は PHP の定数で、現在参照中のファイルのフルパスとファイル名を表します。dirname はパス中のディレクトリを取得する関数です。なお、dirname の結果は最後に / が付かないので、上記の例のように / を付け忘れないようにしましょう。

基本的に include, require は全て dirname(__FILE__) を使って記述しておくと、精神衛生上いいかなって思います。あと、include は include_once にしておくと、更にいいかなって思います。


トラックバック URL


※言及リンクのないトラックバックは削除されます。
※書き込まれてから公開されるまで時間がかかる場合があります。

コメント / トラックバック 5 件

  1. PHP:requireやincludeする時のパスについて(dirname(__FILE__)) | 5×2.info より:

    [...] ジにもっとわかりやすく載っていました。 PHP の include, require で相対パスを指定して読み込む場合のメモ – hoge256ブログ [...]

  2. Taizab より:

    PHPを始めて9ヶ月にもなるのに、恥ずかしながら今日一日この問題で苦しんでいました。おかげさまですきっと解消しました。ありがとうございました!

  3. studioH より:

    知らなかった??????!
    何か変だと思いながら、フルパスを使ってなんとか読み込んでいました。
    勉強になりました。

  4. すとねあ より:

    Google検索からきました。
    おかげで自分が抱えていた問題が解決しました。
    ありがとうございます。

  5. 匿名 より:

    何度試しても解決しませんでした。
    もっと根本的な解決方法ありませんかねぇ・・・
    たかがこれしきのことで不便で仕方がないですねPHPは。

コメントをどうぞ

Spam protection by WP Captcha-Free

※書き込まれてから公開されるまで時間がかかる場合があります。