実行中スクリプトのドキュメントルートからのパスに関しては$_SERVER[“SCRIPT_NAME”]で取得できますが、ファイル自体に対してのパスを取得したり、モジュールにとってのルート的なディレクトリを基準に取得したい場合のための方法を紹介します。
サンプルコード
ディレクトリ構成
-略/htdocs/sample/ --lib/ ---init.php --main.php
ルートのパスを生成するファイル
共通ファイルでは、現在のファイルのパスをdirname関数で遡ることで、ドキュメントルート等任意の場所の絶対パスを取得し、定数に入れておきます。
PHPバージョンの古いサーバーを考慮して、__DIR__定数や、dirnameの階層指定は使用していません。
/sample/lib/init.php
<?php define('ROOT_PATHs', dirname(dirname(__FILE__))."/"); // 今回はルートの二つ下なので、 //「このファイルのあるディレクトリのあるディレクトリ」 ?>
読み込み側ファイル
現在のファイルのパスから、定数に入れておいた基準ディレクトリの絶対パスと一致する部分を削除することで、以降だけのパスを取得することができます。
/sample/main_rootfile.php
<?php // 初期化ファイルはそのファイルの場所に合わせて相対位置で指定。 require_once dirname(__FILE__).'/libs/init.php'; // パスの取得 $file_path = str_replace(ROOT_PATHs, '', __FILE__); echo $file_path // 結果は sample/main_rootfile.php echo "<br>"; $dir_path = str_replace(ROOT_PATHs, '', dirname(__FILE__)); echo $dir_path // 結果は sample ?>
関数化
関数化した例です。
<?php // ここだけ設置位置に合わせて階層修正。 define('ROOT_PATHs', dirname(dirname(dirname(__FILE__)))."/"); /* * @param string ファイルやディレクトリのパス * @return string 基準ディレクトリより上のパスを除去したパス */ function get_path_from_basedir($path){ return str_replace(ROOT_PATHs, '', $path); } ?>
pathinfo風にファイル自体や直上のディレクトリ等複数の情報を連想配列で返すのも、どんなパスか添え字で明示できて有効そうです。