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中没有斜杠,则返回一个点('.'),表示当前目录。否则,返回的字符串是path,其中任何尾随的/component都被删除。

警告

在循环中使用此函数时要小心,该循环可以到达顶级目录,因为这可能导致无限循环。

<?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'。例如,如果您将该 URL 作为表单上的操作,则提交表单将尝试转到 http://somepage.php.

当我编写一个位于带有路径的 url 上的站点时遇到了这个问题,www.somehost.com/client/somepage.php,上面的代码运行良好,但随后想要将其放在子域上,client.somehost.com/somepage.php,这时问题开始出现。

最好的解决方案是创建一个生成绝对 URL 的函数并在整个站点中使用它,但是创建一个 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