從 PHP 5.3.0 開始,您可以使用 __DIR__ 來取代 dirname(__FILE__)
(PHP 4, PHP 5, PHP 7, PHP 8)
dirname — 返回父目錄的路徑
給定一個包含檔案或目錄路徑的字串,此函式將返回從目前目錄向上 levels
層的父目錄路徑。
注意:
dirname() 函式直接作用於輸入字串,並不關心實際的檔案系統或路徑組成部分,例如 "
..
"。
在 Windows 上,dirname() 會假設目前設定的字碼頁,因此若要讓它正確識別多位元組字元路徑中的目錄名稱,必須設定相符的字碼頁。如果 path
包含目前字碼頁無效的字元,則 dirname() 的行為未定義。
在其他系統上,dirname() 假設 path
以 ASCII 相容編碼編碼。否則,函式的行為未定義。
path
一個路徑。
在 Windows 上,斜線 (/
) 和反斜線 (\
) 都用作目錄分隔字元。在其他環境中,則使用正斜線 (/
)。
levels
要向上移動的父目錄層數。
這必須是一個大於 0 的整數。
返回父目錄的路徑。如果 path
中沒有斜線,則返回一個點 ('.
'),表示目前目錄。否則,返回的字串是移除任何尾端 /component
的 path
。
在迴圈中使用此函式時要小心,因為如果迴圈可能到達頂層目錄,則可能會導致無限迴圈。
<?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
從 PHP 5.3.0 開始,您可以使用 __DIR__ 來取代 dirname(__FILE__)
由於範例中給出的路徑只有兩個部分(例如 "/etc/passwd"),因此不清楚 dirname 是返回父目錄的單一路徑元素,還是返回到父目錄的完整路徑(包含父目錄)。從實驗來看,它似乎是後者。
例如:
dirname('/usr/local/magic/bin');
返回 '/usr/local/magic' 而不是只有 'magic'
此外,dirname 會返回路徑最後一個項目的父目錄,無論最後一個項目是目錄還是檔案,這一點也不立即明顯。(也就是說,人們可能會認為,如果給定的路徑是一個目錄,那麼 dirname 將返回整個原始路徑,因為那是一個目錄名稱。)
此外,路徑末尾的目錄分隔符號並不一定表示路徑的最後一個項目是目錄,因此
dirname('/usr/local/magic/bin/'); # 注意最後的 '/'
將返回與上面範例相同的結果。
簡而言之,這似乎更像是一個字串處理函式,它會從路徑字串中移除最後一個非空的檔案或目錄元素。
要取得目前引入檔案的目錄
<?php
dirname(__FILE__);
?>
例如,如果一個名為 'database.init.php' 的腳本(從檔案系統的任何位置引入)想要引入位於同一目錄中的腳本 'database.class.php',您可以使用
<?php
include_once(dirname(__FILE__) . '/database.class.php');
?>
請注意,如果您在 Windows 上呼叫 dirname(__FILE__),可能會得到反斜線。如果您接著嘗試使用 str_replace() 或 preg_replace() 並以正斜線作為搜尋模式來替換路徑的一部分,則將找不到相符的結果。您可以在進行任何轉換之前,使用 $path = str_replace('\\', '/' ,$path) 將路徑正規化。
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;
}
?>
使用這個要注意。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]: \