HOWTO · PHP

在 PHP 中获取当前目录名称和路径

本教程介绍如何在 PHP 中获取当前目录名和路径。

本页内容

PHP 中有多种处理当前路径的方式,应该选哪一种取决于“当前”指的是什么。getcwd() 返回进程的工作目录;__DIR__ 表示当前 PHP 文件所在的目录。当脚本从其他目录启动,或被另一个文件引入时,这两个位置可能不同。使用 dirname() 可从路径取得其父目录;需要路径的最后一部分时,则可使用 basename()。

使用 getcwd() 获取当前工作目录

调用 getcwd() 可将进程的工作目录作为路径字符串获取。许多相对文件系统路径以此目录为基准,但它不一定是脚本文件所在的目录。include 和 require 还会使用其他查找规则,包括 include_path 和调用文件所在的目录,因此仅凭 getcwd() 无法说明所有 include 路径的解析方式。例如,命令行进程可能从 /srv/app 启动,并运行存放在 /srv/app/bin 中的脚本;在这种情况下,getcwd() 指向 /srv/app。这些路径仅供说明,因为工作目录由进程的启动方式决定,并且可能在运行期间发生变化。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

<?php
$workingDirectory = getcwd();
if ($workingDirectory !== false) {
    echo $workingDirectory;
}
?>

如果 PHP 能确定工作目录,示例就会输出该目录。其绝对路径取决于进程的启动方式。在应用程序代码中,使用 getcwd() 前应检查其返回值:如果 PHP 无法确定工作目录,该函数可能返回 false。在拼接路径或将结果传给文件操作之前,先处理这种情况。

使用 DIR 获取当前脚本目录

魔术常量 __DIR__ 表示它所在的 PHP 文件所属的目录。与 getcwd() 不同,即使进程从其他位置启动,__DIR__ 仍对应这个文件。如果 bootstrap.php 引入了 lib/config.php,那么写在 config.php 中的 __DIR__ 指向 config.php 所在目录,而不是 bootstrap.php 所在目录,也不一定是进程的工作目录。

本节中的代码以及显示的标签或输出仍为英文。

<?php
$scriptDirectory = __DIR__;
echo $scriptDirectory;
?>

当资源文件与当前脚本一起发布时,这种方式很有用。例如,脚本可以根据 $scriptDirectory 构造指向同级资源的路径,使查找不受启动目录影响。示例显示的绝对路径会因安装位置而异,因此没有固定的输出值。dirname(__FILE__) 也能取得当前文件所在的目录;__FILE__ 是该文件的完整路径。

使用 dirname() 从路径取得目录

如果已有一个路径,并且需要取得它的父目录,可以使用 dirname()。将它应用于 __DIR__,会向上取得当前文件所在目录的上一级;应用于 __FILE__,则会返回该文件所在的目录。此函数只处理路径字符串,不会检查得到的目录是否实际存在。

本节中的代码以及显示的标签或输出仍为英文。

<?php
$parentDirectory = dirname(__DIR__);
echo $parentDirectory;
?>

对于位于 /srv/app/src 下的文件,这种写法会得到 /srv/app。示例路径仅供参考;实际结果取决于 PHP 文件的位置。当资源位于父目录中时,可将得到的路径用作基准;如果操作要求目录确实存在,则应另外验证文件系统访问情况。

使用 basename() 获取目录名称

basename() 会返回所提供路径的最后一部分。对于 /var/www/project 这样的目录路径,它返回 project,而不是完整路径。对于 /var/www/project/config.php 这样的文件路径,它返回 config.php,也就是文件名。因此,输入路径不同,这个函数可以提取目录名称,也可以提取文件名。

如果只需要路径末段来显示或比较,可以使用 basename()。进行文件操作时应保留原始完整路径:单独的末段无法标识唯一位置,而且它可能对应文件系统中不同位置的目录。

根据任务选择合适的路径

  • 如果相对路径应以进程的工作目录为基准解析,请使用 getcwd()。使用前检查它是否因失败而返回 false。
  • 如果路径应以 PHP 文件本身为基准,请使用 __DIR__,包括通过 include 或 require 加载的代码。
  • 使用 dirname() 从 __DIR__、__FILE__ 或其他路径取得父目录。
  • 如果只需要路径的最后一部分,请使用 basename();定位资源时应保留完整路径。

对于应用程序附带的配置文件、模板和其他资源,使用 __DIR__ 构造的路径通常比以进程工作目录为基准的路径更可预测。如果调用方有意控制工作目录,例如命令行工具要操作指定文件夹,则可选择 getcwd()。