【PHP8.x】dirname関数の使い方

dirname関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

dirname関数は、指定されたパス文字列から、その一つ上の階層にあたる親ディレクトリのパスを取得する関数です。

この関数は、ファイルやディレクトリのフルパス(例: /var/www/html/index.php/home/user/documents)を引数として渡すと、そのパスから一番末尾の要素(ファイル名や最後のディレクトリ名)を取り除いた部分を返します。例えば、/var/www/html/index.php の場合は /var/www/html を、/home/user/documents の場合は /home/user を取得できます。

PHP 7.0.0以降、末尾にスラッシュ(/)を持つパスの挙動が変更されました。現在のバージョン(PHP 8を含む)では、/path/to/directory/ のように末尾にスラッシュがあるパスを指定した場合、dirname() 関数は /path/to/directory を返します。一方で、/path/to/directory のように末尾にスラッシュがないパスを指定した場合は /path/to が返されます。この挙動の違いは、末尾のスラッシュが無視された後、残ったパス全体がそのパスの親ディレクトリとして返されるためです。

ルートディレクトリ(/)を指定した場合は / が、空文字列('')を指定した場合は . (カレントディレクトリを表す)が返されます。Windows環境でのパス(例: C:\path\to\file.txt)に対しても適切に動作し、C:\path\to を返します。

この関数は、ファイルパスやディレクトリパスを操作する際に、特定のファイルが所属するディレクトリや、あるディレクトリの一つ上の階層のパスを動的に取得したい場合に非常に役立ちます。例えば、設定ファイルのパスからそのディレクトリパスを取得して、関連する別のファイルを読み込む際などに利用できます。

構文(syntax)

1<?php
2$path = "/usr/local/bin/php";
3$directory_name = dirname($path);
4?>

引数(parameters)

string $path, int $levels = 1

  • string $path: ディレクトリパスを指定する文字列
  • int $levels = 1: 指定したパスから親ディレクトリをいくつ遡るかを指定する整数。デフォルトは1で、指定したパスの親ディレクトリを返します。

戻り値(return)

string

与えられたファイルパス文字列から、パスのディレクトリ部分を文字列として返します。

サンプルコード

PHP dirname(DIR) で親ディレクトリを取得する

1<?php
2
3// __DIR__ は、現在のスクリプトファイルが存在するディレクトリのフルパスを返します。
4// 例: `/var/www/html/public`
5$currentScriptDir = __DIR__;
6echo "現在のスクリプトのディレクトリ: " . $currentScriptDir . PHP_EOL;
7
8// dirname() 関数は、指定されたパスの親ディレクトリのパスを返します。
9// dirname(__DIR__) は、現在のスクリプトのディレクトリの親ディレクトリを返します。
10// 例: `/var/www/html/public` の親は `/var/www/html`
11$parentDir = dirname(__DIR__);
12echo "現在のスクリプトの親ディレクトリ: " . $parentDir . PHP_EOL;
13
14// dirname() 関数の第二引数 $levels を使用すると、指定した階層数の親ディレクトリを取得できます。
15// 例えば、2を指定すると2つ上の親ディレクトリを返します。
16// 例: `/var/www/html/public` から2つ上は `/var/www`
17$grandparentDir = dirname(__DIR__, 2);
18echo "現在のスクリプトの祖父ディレクトリ (2階層上): " . $grandparentDir . PHP_EOL;
19
20?>

PHPのdirname関数は、指定されたファイルパスやディレクトリパスの親ディレクトリのパスを取得するために使用します。

第一引数$pathには、親ディレクトリを取得したい対象のパスを文字列で指定します。第二引数$levelsはオプションで、デフォルト値は1です。この引数にnという整数を指定すると、指定されたパスからn階層上の親ディレクトリのパスを文字列として返します。

サンプルコードでは、まずPHPの特殊定数__DIR__が登場します。これは、現在のスクリプトファイルが存在するディレクトリのフルパスを自動的に返してくれるものです。例えば、/var/www/html/publicというディレクトリでスクリプトが実行されていれば、__DIR__はこのパスを返します。

dirname(__DIR__)と記述すると、現在のスクリプトの親ディレクトリ、つまり__DIR__が示すパスの一つ上のディレクトリのパスを取得できます。上記の例では、/var/www/htmlが取得されます。

さらに、dirname(__DIR__, 2)のように第二引数に2を指定すると、現在のスクリプトのディレクトリから2つ上の親ディレクトリのパスを取得できます。先の例でいえば、/var/wwwが取得されることになります。

この関数は、アプリケーション内で設定ファイルやライブラリなど、特定のリソースへのパスを現在のスクリプトの位置を基準に動的に解決したい場合に非常に役立ちます。

__DIR__は現在のスクリプトファイルが存在するディレクトリの絶対パスを示すマジック定数です。これ単体でファイル名を含まないパスを返します。dirname()関数は、指定されたパスの親ディレクトリのパスを取得する際に利用します。そのため、dirname(__DIR__)と記述すると、現在のスクリプトがあるディレクトリの「一つ上のディレクトリ」のパスを確実に取得できます。

また、dirname()関数の第二引数に数値($levels)を指定すると、指定した階層数だけ上の親ディレクトリを取得することが可能です。例えば「2」を指定すると2つ上のディレクトリが得られます。これらの機能は、設定ファイルや共通ライブラリのパスを動的に指定するなど、ファイルシステム上の位置関係に基づいて柔軟にパスを構築する際に非常に重要です。パス区切り文字はPHPが自動的にOSに合わせて処理するため、環境依存を気にせず利用できます。

dirname(__FILE__)で現在のディレクトリパスを取得する

1<?php
2
3/**
4 * dirname() 関数は、指定されたパスの親ディレクトリのパスを返します。
5 * __FILE__ は、現在のスクリプトファイルのフルパスとファイル名を含むマジック定数です。
6 */
7
8// 1. 現在のスクリプトファイル自身のフルパスを取得します。
9// 例: /var/www/html/public/index.php
10$currentFilePath = __FILE__;
11echo "現在のファイルパス: " . $currentFilePath . "\n\n";
12
13// 2. dirname(__FILE__) を使用して、現在のスクリプトが存在するディレクトリのパスを取得します。
14// これは、現在のディレクトリの絶対パスを返します。
15// 例: /var/www/html/public
16$currentDirectory = dirname($currentFilePath);
17echo "現在のディレクトリ (dirname(__FILE__)): " . $currentDirectory . "\n";
18
19// 3. dirname() の第二引数 'levels' を使用して、指定した階層数だけ上のディレクトリを取得します。
20// dirname(__FILE__, 2) は、現在のファイルから2階層上のディレクトリのパスを返します。
21// 例: /var/www/html
22$twoLevelsUpDirectory = dirname($currentFilePath, 2);
23echo "2階層上のディレクトリ (dirname(__FILE__, 2)): " . $twoLevelsUpDirectory . "\n";
24
25// 4. PHP 5.3 以降では、__DIR__ マジック定数を使うと、
26// dirname(__FILE__) と同じく現在のスクリプトのディレクトリパスを直接取得できます。
27// 例: /var/www/html/public
28$currentDirectoryUsingDir = __DIR__;
29echo "現在のディレクトリ (__DIR__): " . $currentDirectoryUsingDir . "\n";
30
31?>

PHPのdirname()関数は、指定されたパスから親ディレクトリのパスを取得する際に利用されます。この関数は、最初の引数string $pathに処理したいパス文字列を受け取り、オプションの第二引数int $levelsで何階層上のディレクトリを取得するかを指定できます。$levelsを省略した場合、デフォルトで1階層上、つまり直接の親ディレクトリのパスがstring型で戻り値として返されます。

__FILE__は、現在のスクリプトファイル自身のフルパスとファイル名を表すPHPのマジック定数です。これとdirname()関数を組み合わせたdirname(__FILE__)は、現在のスクリプトファイルが存在するディレクトリのパスを取得する一般的な方法です。例えば、/var/www/html/public/index.phpというファイルで実行すると、結果として/var/www/html/publicというパスが得られます。

さらに、dirname(__FILE__, 2)のように第二引数に数値の2を指定すると、現在のファイルから2階層上のディレクトリのパス、例えば/var/www/htmlのような結果を取得できます。また、PHP 5.3以降では__DIR__というマジック定数を使用すると、dirname(__FILE__)と全く同じく現在のスクリプトのディレクトリパスを直接取得することが可能です。これらの機能は、設定ファイルの読み込みや、他のファイルをインクルードする際の基準パスを指定するなど、様々な場面で活用されます。

dirname(__FILE__)は、実行中のPHPスクリプトファイルが存在するディレクトリの絶対パスを返します。初心者は、この関数が相対パスではなく常に絶対パスを返す点に注意が必要です。PHP 5.3以降では、同じく絶対パスを返す__DIR__マジック定数を使用するのがより簡潔で、推奨されています。

dirname()関数の第二引数に2などの数値を指定すると、現在のファイルから指定した階層数だけ上の親ディレクトリの絶対パスを直接取得でき、多階層のファイル構成で便利です。これらの関数や定数は、設定ファイルの読み込みや他のファイルへのパス指定など、ファイルシステム内の相対的な位置関係を基準にパスを構築する際に非常に役立ちます。返されるパスは常に文字列形式で、安全なパス構築の基本として利用できます。

関連コンテンツ