PHPにおける相対パス
すでにご存知のように、関数 file_get_contents
のパラメータにはファイル名を記述します。しかし、これが機能するのは、
読み込むファイルが実行されるスクリプトと同じフォルダに
ある場合のみです。
ファイルが別の場所にある場合、関数のパラメータには そのファイルへのパスを記述する必要があります。
例を見てみましょう。
例
次のようなファイル構造があるとします:
- index.php
- /directory/
- test.txt
テキストファイルの内容を読み取ってみましょう。 このためには、ファイル名に加えて、 ファイルが置かれているフォルダも指定する必要があります:
<?php
echo file_get_contents('directory/test.txt');
?>
例
次のようなファイル構造があるとします:
- /script/
- index.php
- test.txt
この場合、ファイルへのパスとして単にその名前を指定して ファイルを読み取ろうとすると、エラーで終了します:
<?php
echo file_get_contents('test.txt'); // エラーが発生します
?>
なぜエラーが発生するのでしょうか?それは、関数のパラメータに ファイル名を記述したためです。これは、 読み込むファイルが実行されるファイルと同じフォルダに 配置されている必要があることを意味します。
しかし、私たちの読み込むファイルは1つ上のレベル、 つまりスクリプトを含むフォルダを包含するフォルダに 存在しています。
この場合、ファイルへのパスに、そのファイルを1つ上のレベルで
探す必要があることを明示的に指定しなければなりません。
そのためには、ファイル名の前に ../ と記述します。
これを行ってみましょう:
<?php
echo file_get_contents('../test.txt'); // ファイルが読み取られます
?>
例
次のようなファイル構造があるとします:
- /script/
- index.php
- /directory/
- test.txt
この場合、ファイルを読み取る際に、まず1つ上のレベルに出て、 その後、そのレベルを基準としたファイルへのパスを指定します:
<?php
echo file_get_contents('../directory/test.txt');
?>
例
次のようなファイル構造があるとします:
- /script/
- /test/
- index.php
- /test/
- /directory/
- test.txt
この場合、上に2回出る必要があります:
<?php
echo file_get_contents('../../directory/test.txt');
?>
実践的な課題
テキストファイルの内容を読み取るコードを 記述してください:
- index.php
- /dir1/
- /dir2/
- test.txt
- /dir2/
テキストファイルの内容を読み取るコードを 記述してください:
- /script/
- index.php
- /dir1/
- /dir2/
- test.txt
- /dir2/
テキストファイルの内容を読み取るコードを 記述してください:
- /script1/
- /script2/
- index.php
- /script2/
- /dir/
- test.txt
テキストファイルの内容を読み取るコードを 記述してください:
- /script1/
- /script2/
- /script3/
- index.php
- /script3/
- /script2/
- /dir1/
- /dir2/
- /dir3/
- test.txt
- /dir3/
- /dir2/