phpの基本シリーズです。
require_onceで入れ子状態でファイルを参照するときの問題。
参照したファイルにもrequire_onceが書いてある場合、普通に書いてあったのでは参照エラーになる。
こういうとき親ディレクトリのパスを表示するdirname(__FILE__)の使用はマストです。
require_onceのときのパスでエラー
たとえばrequire_onceの場合、以下の問題がある。
test/a.php
test/dir1/b.php
test/dir2/c.php
の三つのファイルがある場合。
b.phpファイルからc.phpファイルを読み込み、それをa.phpファイルで読み込んで、結果b.php、c.phpの両方の内容をa.phpファイルに読み込みたい、とする。
b.phpファイルには「require_once(../dir2/c.php)」と記述。
b.phpファイルを実行した場合、問題なくc.phpを読み込む。
a.phpファイルには「require_once(.dir1/b.php)」と記述。
a.phpファイルを実行した場合、「require_once(.dir1/b.php)」は問題なし。
しかし読み込んだb.phpファイルの「require_once(../dir2/c.php)」の部分でエラー。
なぜか?
require_onceは実行しているファイルからのパスで参照する。
つまり実行ファイルa.phpから参照したb.phpファイル内の「require_once(../dir2/c.php)」の部分は、a.phpファイルがある階層から「../dir2/c.php」のパスで探しに行ってしまってエラーになる。
仮にb.phpに「require_once(dir2/c.php)」と書いてあれば、a.phpからb.phpを参照してもエラーなしにc.phpを参照してくれる。
しかしこれではb.phpを単独で実行した時にc.phpを参照出来ずにエラーになる。
phpでシステムを作っているときに最初は原因がわからずにこの問題で苦労しました。
これの対応策で親ディレクトリのパスを表示するdirname(__FILE__)を使います。
dirname(__FILE__)は自身がいるディレクトリの絶対パスを返す。
dirname()
これは 親ディレクトリのパスを返す関数。
__FILE__
これはマジカル定数と呼ばれているもので、ファイルのフルパスとファイル名が格納されている定数。(自身のファイル名とそのフルパス)
MAMP/htdocs/PHPディレクトリにあるindex.phpに次のように書いた場合
echo __FILE__;
の結果は
/Applications/MAMP/htdocs/PHP/index.php
ルートからの絶対パスと自身のファイル名が返ってくる。
echo dirname(__FILE__);
の結果は
/Applications/MAMP/htdocs/PHP(最後にスラッシュがつかない事に注意)
ルートからの絶対パスが返ってくる。
dirname()関数の引数に__FILE__を入れる。
dirname(__FILE__)を使うと
ルート(親)ディレクトリから自分への絶対パスが得られる。
https://stray-light.info/wp/php/にあるtest.php
にdirname(__FILE__)を書くと
/wp/php/が返ってくる。
このtest.phpを
https://stray-light.info/wp/php/script/に移動すると
dirname(__FILE__)が返してくるのは
/wp/php/script/になる。
どこへ移動しようともルート(親)からの絶対パスを返してくれる。
これを使ってみる。
a.phpには「require_once(dirname(__FILE__).’/dir1/b.php’)」
b.phpには「require_once(dirname(__FILE__).’/../dir2/c.php’)」
と記述。
結果、絶対パスになりどこから参照しても問題なく読み込める。
dirname(__FILE__)で得られるパスの最後にスラッシュはつかないので、「’/../dir2/c.php’」のように続くパスの先頭にスラッシュを付けるのを忘れずに。
↓プログラミングで壁にぶち当たったときはここで助けてもらっています。
エンジニア特化型Q&Aサイト「teratail」
コメント