2024 日本 PHP 研討會

dirname

(PHP 4, PHP 5, PHP 7, PHP 8)

dirname返回父目錄的路徑

說明

dirname(字串 $path, 整數 $levels = 1): 字串

給定一個包含檔案或目錄路徑的字串,此函式將返回從目前目錄向上 levels 層的父目錄路徑。

注意:

dirname() 函式直接作用於輸入字串,並不關心實際的檔案系統或路徑組成部分,例如 ".."。

警告

在 Windows 上,dirname() 會假設目前設定的字碼頁,因此若要讓它正確識別多位元組字元路徑中的目錄名稱,必須設定相符的字碼頁。如果 path 包含目前字碼頁無效的字元,則 dirname() 的行為未定義。

在其他系統上,dirname() 假設 path 以 ASCII 相容編碼編碼。否則,函式的行為未定義。

參數

path

一個路徑。

在 Windows 上,斜線 (/) 和反斜線 (\) 都用作目錄分隔字元。在其他環境中,則使用正斜線 (/)。

levels

要向上移動的父目錄層數。

這必須是一個大於 0 的整數。

返回值

返回父目錄的路徑。如果 path 中沒有斜線,則返回一個點 ('.'),表示目前目錄。否則,返回的字串是移除任何尾端 /componentpath

警告

在迴圈中使用此函式時要小心,因為如果迴圈可能到達頂層目錄,則可能會導致無限迴圈。

<?php
dirname
('.'); // 會返回 '.'。
dirname('/'); // 在 Windows 上會返回 `\`,在 *nix 系統上會返回 '/'。
dirname('\\'); // 在 Windows 上會返回 `\`,在 *nix 系統上會返回 '.'。
dirname('C:\\'); // 在 Windows 上會返回 'C:\',在 *nix 系統上會返回 '.'。
?>

更新日誌

版本 說明
7.0.0 新增了可選的 levels 參數。

範例

範例 #1 dirname() 範例

<?php
echo dirname("/etc/passwd") . PHP_EOL;
echo
dirname("/etc/") . PHP_EOL;
echo
dirname("./") . PHP_EOL;
echo
dirname("C:\\") . PHP_EOL;
echo
dirname("/usr/local/lib", 2);

以上範例的輸出會類似如下:

/etc
/ (or \ on Windows)
.
C:\
/usr

另請參閱

新增註解

使用者貢獻的註解 6 則註解

y dot a dot dejong at singular dot of dot alumni dot utwente dot nl
10 年前
從 PHP 5.3.0 開始,您可以使用 __DIR__ 來取代 dirname(__FILE__)
tobylewis at mac dot com
19 年前
由於範例中給出的路徑只有兩個部分(例如 "/etc/passwd"),因此不清楚 dirname 是返回父目錄的單一路徑元素,還是返回到父目錄的完整路徑(包含父目錄)。從實驗來看,它似乎是後者。

例如:

dirname('/usr/local/magic/bin');

返回 '/usr/local/magic' 而不是只有 'magic'

此外,dirname 會返回路徑最後一個項目的父目錄,無論最後一個項目是目錄還是檔案,這一點也不立即明顯。(也就是說,人們可能會認為,如果給定的路徑是一個目錄,那麼 dirname 將返回整個原始路徑,因為那是一個目錄名稱。)

此外,路徑末尾的目錄分隔符號並不一定表示路徑的最後一個項目是目錄,因此

dirname('/usr/local/magic/bin/'); # 注意最後的 '/'

將返回與上面範例相同的結果。

簡而言之,這似乎更像是一個字串處理函式,它會從路徑字串中移除最後一個非空的檔案或目錄元素。
tapken at engter dot de
22 年前
要取得目前引入檔案的目錄

<?php
dirname
(__FILE__);
?>

例如,如果一個名為 'database.init.php' 的腳本(從檔案系統的任何位置引入)想要引入位於同一目錄中的腳本 'database.class.php',您可以使用

<?php
include_once(dirname(__FILE__) . '/database.class.php');
?>
bobray at softville dot com
5 年前
請注意,如果您在 Windows 上呼叫 dirname(__FILE__),可能會得到反斜線。如果您接著嘗試使用 str_replace() 或 preg_replace() 並以正斜線作為搜尋模式來替換路徑的一部分,則將找不到相符的結果。您可以在進行任何轉換之前,使用 $path = str_replace('\\', '/' ,$path) 將路徑正規化。
joe dot naylor at gmail dot com
15 年前
dirname 函式通常不會在結尾返回斜線,這可能會讓您使用以下程式碼建立連結:
$url = dirname($_SERVER['PHP_SELF']) . '/somepage.php';

然而,如果指定的路徑是根目錄,dirname 會返回一個斜線,因此在這種情況下,$url 會變成 '//somepage.php'。例如,如果您將該網址作為表單的動作,提交表單將會嘗試前往 http://somepage.php.

當我在路徑網址 www.somehost.com/client/somepage.php 上撰寫網站時,遇到了這個問題,上述程式碼運作良好,但後來想將其放在子網域 client.somehost.com/somepage.php 上時,事情就開始出錯了。

最好的解決方案是建立一個產生絕對網址的函式,並在整個網站中使用它,但建立一個 safe_dirname 函式(以及一個 htaccess 重寫規則來修復雙斜線以防萬一)為我解決了這個問題。

<?php
function safe_dirname($path)
{
$dirname = dirname($path);
return
$dirname == '/' ? '' : $dirname;
}
?>
klugg this-is-junk at tlen dot pl
19 年前
使用這個要注意。Dirname 喜歡搞亂斜線。
在 Windows 上的 Apache:

<?php
echo '$_SERVER[PHP_SELF]: ' . $_SERVER['PHP_SELF'] . '<br />';
echo
'Dirname($_SERVER[PHP_SELF]: ' . dirname($_SERVER['PHP_SELF']) . '<br>';
?>

會印出:

$_SERVER[PHP_SELF]: /index.php
Dirname($_SERVER[PHP_SELF]: \
To Top