HOWTO · PHP

PHP で現在のディレクトリ名とパスを取得する

このチュートリアルでは、PHP で現在のディレクトリ名とパスを取得する方法を紹介します。

このページの内容

現在のパスを扱うPHPの方法はいくつかあり、適切な方法は「現在」が何を指すかによって異なります。getcwd()はプロセスの作業ディレクトリを返し、__DIR__は現在のPHPファイルが置かれているディレクトリを示します。スクリプトを別のディレクトリから起動した場合や、別のファイルから読み込んだ場合、この2つの場所は異なることがあります。dirname()はパスから親ディレクトリを求めるときに使い、パスの最後の要素だけが必要な場合はbasename()を使います。

getcwd()で現在の作業ディレクトリを取得する

getcwd()を呼び出すと、プロセスの作業ディレクトリをパス文字列として取得できます。このディレクトリは多くの相対ファイルシステムパスの基準になりますが、スクリプトファイルが置かれているディレクトリとは限りません。includeとrequireでは、include_pathや呼び出し元ファイルのディレクトリなど、追加の検索動作が使われます。そのため、getcwd()だけでは、すべてのインクルードパスがどのように解決されるかは分かりません。たとえば、コマンドラインのプロセスが/srv/appから開始され、/srv/app/binにあるスクリプトを実行する場合、getcwd()が示すのは/srv/appです。作業ディレクトリはプロセスの起動方法によって決まり、実行中に変更されることもあるため、こうしたパスは例示として扱ってください。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

<?php
$workingDirectory = getcwd();
if ($workingDirectory !== false) {
    echo $workingDirectory;
}
?>

PHPが作業ディレクトリを特定できる場合、この例はプロセスの作業ディレクトリを出力します。絶対パスはプロセスの起動方法によって異なります。アプリケーションのコードでは、getcwd()の戻り値を使う前に確認してください。PHPが作業ディレクトリを特定できない場合、この関数はfalseを返すことがあります。パスを連結したり、ファイル操作に渡したりする前に、この戻り値を適切に処理します。

__DIR__で現在のスクリプトのディレクトリを取得する

マジック定数__DIR__は、それが記述されたPHPファイルのディレクトリを表します。getcwd()とは異なり、プロセスが別の場所から起動されても、そのファイルに対応する値を示します。たとえば、bootstrap.phpがlib/config.phpを読み込む場合、config.php内に記述した__DIR__が指すのはconfig.phpのあるディレクトリです。bootstrap.phpのディレクトリでも、必ずしもプロセスの作業ディレクトリでもありません。

このセクションのコードと表示されるラベルや出力は英語のままです。

<?php
$scriptDirectory = __DIR__;
echo $scriptDirectory;
?>

これは、現在のスクリプトと一緒に配布されるファイルを扱うときに便利です。たとえば、スクリプトは$scriptDirectoryを使って同じ階層にあるリソースへのパスを組み立てられるため、起動時のディレクトリに左右されずにファイルを探せます。表示される絶対パスはインストール環境によって異なるため、この例に固定の出力値はありません。dirname(__FILE__)も、現在のファイルがあるディレクトリを取得する同等の方法です。__FILE__はそのファイルのフルパスを表します。

dirname()でパスからディレクトリを求める

すでにあるパスから親ディレクトリを取得したい場合は、dirname()を使います。__DIR__に適用すると現在のファイルのディレクトリから1階層上に移動し、__FILE__に適用するとファイルが置かれているディレクトリを返します。この関数はパス文字列を処理するもので、求めたディレクトリが実際に存在するかどうかは確認しません。

このセクションのコードと表示されるラベルや出力は英語のままです。

<?php
$parentDirectory = dirname(__DIR__);
echo $parentDirectory;
?>

/srv/app/srcにあるファイルを例にすると、この方法で/srv/appを求められます。例のパスは説明用で、実際の値はPHPファイルの場所に応じて決まります。親フォルダーにリソースがある場合は、求めたパスを基準として使います。既存のディレクトリが必要な操作では、ファイルシステムへのアクセス可否を別途確認してください。

basename()でディレクトリ名を取得する

basename()は、渡したパスの最後の要素を返します。/var/www/projectのようなディレクトリパスを渡すとprojectを返し、フルパスは返しません。/var/www/project/config.phpのようなファイルパスを渡すと、ファイル名であるconfig.phpを返します。つまり、入力するパスに応じて、同じ関数でディレクトリ名またはファイル名を取り出せます。

最後の要素だけで十分な表示や比較にはbasename()を使います。ファイル操作では元のフルパスを保持してください。最後の要素だけでは場所を一意に特定できず、ファイルシステム内の別の場所にあるディレクトリを指す可能性があります。

用途に応じて適切なパスを選ぶ

  • 相対パスをプロセスの作業ディレクトリを基準に解決する場合は、getcwd()を使います。使用前に、失敗を示すfalseが返っていないか確認してください。
  • PHPファイル自体を基準にパスを組み立てる場合は、includeやrequireで読み込まれたコードも含めて、__DIR__を使います。
  • __DIR__、__FILE__、その他のパスから親ディレクトリを求めるには、dirname()を使います。
  • パスの最後の要素だけが必要な場合はbasename()を使い、リソースの場所を特定するときはフルパスを保持します。

設定ファイル、テンプレート、その他アプリケーションと一緒に保存されるリソースには、プロセスの作業ディレクトリを基準にするより、通常は__DIR__から組み立てたパスのほうが予測しやすくなります。コマンドラインツールが指定されたフォルダーを操作する場合のように、呼び出し元が作業ディレクトリを意図的に制御するなら、getcwd()を選びます。