PHPでincludeを使うときの注意

PHPでinclude(またはrequire)を使うときに参照先がさらに別のファイルを参照している際の取り扱いで少し引っかかったのでメモしておきます。

ディレクトリ(フォルダ)の構造

  • haru
    • onaji.php
    • saki.php
    • bunsho.txt
  • natsu
    • hoka.php

メインとなるファイルはsaki.phpです。プログラムの中でbunsho.txtを参照します。
同じディレクトリのonaji.phpからincludeを使ってsaki.phpを参照します。
しかし別のディレクトリのhoka.phpから参照する場合に不具合が起きました。

同じディレクトリ

onaji.php -> saki.php -> bunsho.txt

メインとなるファイルは次のとおりです。

saki.php

$filename = "bunsho.txt";
$list = file_get_contents($filename);
print $list;

同じディレクトリにあるbunsho.txtというテキストファイルの内容を取得して、印字するだけです。
これを同じディレクトリにあるonaji.phpから参照しました。

onaji.php

include("saki.php");

この場合は問題ありません。

別のディレクトリ

hoka.php -> saki.php -> bunsho.txt

同じことを別のディレクトリにあるhoka.phpから行うと不具合が起きます。

hoka.php

include("../haru/saki.php");

Warning: file_get_contents(bunsho.txt) [function.file-get-contents]: failed to open stream: No such file or directory in xxxxx\haru\saki.php on line 2

saki.phpの参照先であるbunsho.txtというファイルはない、というエラーです。
つまりincludeした参照先はあたかも参照元と同じディレクトリにあるのと同じ挙動をするのです。
したがって参照先がさらに別のファイルを参照するときはそのように書き換えるか、もしくは相対参照ではなく絶対参照で書きます。
絶対参照は「http://」から始まるURLを直に書く方法ですが、もしディレクトリの構造を変えるとそのたびに書き直さなければなりません。

そこで次のようにします。

saki.php

$filename = dirname(__FILE__) . "/bunsho.txt";
$list = file_get_contents($filename);
print $list;

「dirname(__FILE__)」を使うと実行中のファイルのディレクトリの文字列を絶対参照で取得することができます。
/bunsho.txt”の最初のスラッシュも忘れずに。

コメント

タイトルとURLをコピーしました