从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
中没有斜杠,则返回一个点('.
'),表示当前目录。否则,返回的字符串是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
从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'。例如,如果您将该 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;
}
?>
注意这一点。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]: \