【2019年11月15日】

昨日は、相対パスの基準はURLで直接指定されたphpファイルとなるという話をした。
でも出来れば、今まさに動いているコード部分の記述されたファイルが基準になって欲しいって思うことってないだろうか?

昨日の例で言うと、class/BbLogic.phpから、data/bbs.dataを参照する場合に、../data/bbs.datというパスで呼び出せた方がスクリプトを記述するものとしては分かりやすくなります。

実はこれができる。
PHPには自動的に定義される定数がいくつかあるが、その中の一つに、__FILE__(アンダースコア2個ずつ)というものが存在する。
この定数には、これが記述されているファイルの絶対パスが入っている。

例えばURLが、

http://www.hoge.com/bbs.php

だとして、ここからclass/BbsLogic.phpをrequireし、このBbsLogic.phpの中でdata/bbs.datを読み込む場合、

<?php

require_once dirname(__FILE__) . '/../data/bbs.dat';

?>

という記述になる。
ていうかURLとか関係ない。
dirname関数は、引数のファイルパスの親ディレクトリのパスを返す。

つまり例えばBbsLogic.phpの絶対パスが、

/home/public_html/class/BbsLogic.php

だとしたら、
__FILE__には"/home/public_html/class/BbsLogic.php"が入っており、
dirname(__FILE__)は"/home/public_html/class"を返す。
これを基準にすると、ライブラリ間で相対パスでの参照も可能になる。

まあ、基本は絶対パスとするのが一番なのだが。