プログラミング備忘録

忘れない様にメモ

*

dirname(__FILE__)の使い方

      2018/07/15

phpの基本シリーズです。

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__)を使うと

ルートディレクトリから自分への絶対パスが得られる。

http://stray-light.info/wp/php/にあるtest.php
dirname(__FILE__)を書くと
/wp/php/が返ってくる。

このtest.phpを

http://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’」のように続くパスの先頭にスラッシュを付けるのを忘れずに。

ローカルサーバーでも
MAMP/htdocsのPHPディレクトリにいるとすると、
/Applications/MAMP/htdocs/PHP
ルートからの絶対パスが返ってくる。


 

↓プログラミングで壁にぶち当たったときはここで助けてもらっています。
エンジニア特化型Q&Aサイト「teratail」

この記事は役に立ちましたか? はい いいえ 0人中0人が役に立ったと言っています。

 - PHP