プログラム

PHP:ファイル自体のDocumentRootからのパスを取得する

実行中スクリプトのドキュメントルートからのパスに関しては$_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風にファイル自体や直上のディレクトリ等複数の情報を連想配列で返すのも、どんなパスか添え字で明示できて有効そうです。

お問い合わせフォーム

気になる方はコチラからお問い合わせ!

    必須お名前
    必須メールアドレス
    必須郵便番号
    必須ご住所
    必須電話番号
    ご相談内容
    必須メッセージ本文

    コメントを残す

    *