何时在PHP代码中使用DIRECTORY_SEPARATOR?

39
require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';

上面的代码来自于WordPress的一个插件。 我不明白为什么有一半用了DIRECTORY_SEPARATOR,而另一半用了"/"


13
DIRECTORY_SEPARATOR 不是必需的,PHP 在其文件函数中始终将 "/" 转换为适当的字符。 - fiction
3
“Windows” 理解使用“/”作为目录分隔符。我在 Linux 和 Windows 上运行 PHP 代码时没有任何改变,总是在文件路径等处使用“/”。主要问题是,在文件名方面,“Windows” 不区分大小写,因此在 Windows 上始终使用正确的大小写非常重要,否则移动到“Linux”时可能无法正常工作。 - Ryan Vincent
这只有在你想要在使用不同文件系统的操作系统上运行代码时才很重要,例如Windows或Linux。我只在Linux上使用Apache(即使在Windows 10下,您也可以使用带有Ubuntu子系统的Apache)。因此,我使用正斜杠对所有内容进行编码。 - Markus Zeller
这里的答案不现实。 - Jonathan DS
1
这里解释得非常清楚,请查看https://dev59.com/TnRB5IYBdhLWcg3wbGxB#7032949 - Aryashree Pritikrishna
4个回答

41
因为不同的操作系统有不同的目录分隔符。在 Windows 中是\,在 Linux 中是/DIRECTORY_SEPARATOR是具有该操作系统目录分隔符的常量。在路径中每次使用它。
在您的代码片段中,我们清楚地看到了糟糕的实践代码。如果框架/cms被广泛使用,这并不意味着它使用最佳实践代码。

3
那么为什么同一段代码后面在同一行明确使用了 / - Hanky Panky
2
是的,这就是OP想知道的,是否将它们放在同一行只是一个不好的做法,还是有什么目的?而你的评论实际上是这个问题的一个可能答案。 - Hanky Panky
4
我认为使用常量并非必要。我一直在我的路径中使用“/”,它们可以在Windows和Unix上工作。我认为PHP足够聪明,可以自动转换路径。 - Simon East
2
在WordPress代码中使用DIRECTORY_SEPARATOR没有太多意义,因为WordPress的内置函数不使用它,它们只使用正斜杠(有点不一致,就像正在讨论的代码一样)。在WordPress中,您只需要期望将正斜杠和反斜杠混合使用作为目录分隔符。 但是对于PHP框架之外的代码,或者至少是WordPress之外的代码,我认为您是正确的,最好使用DIRECTORY_SEPARATOR。请参见https://cmljnelson.wordpress.com/2018/07/26/which-way-do-your-slashes-face/ - thespacecamel
4
所有的io函数会根据操作系统自动转换斜杠。不需要使用DIRECTORY_SEPARATOR(除非你将文件路径传递给非PHP代码)。事实上,如Julian在https://dev.to/c33s/always-use--as-directory-seperator-in-php-43l7中指出的那样,它甚至可能导致URL中的意外副作用。 - hostingutilities.com
显示剩余3条评论

13

所有的PHP IO函数都会内部转换斜杠为相应的字符,所以使用哪种方法并不是很重要。以下是一些需要考虑的事项。

  • 如果打印出文件路径时有 \/ 的混合,会显得丑陋和令人困惑。如果使用 DIRECTORY_SEPARATOR 就永远不会出现这种情况。

  • 使用像 $generated_css = DIRECTORY_SEPARATOR.'minified.css'; 这样的语句来进行文件IO操作是完全没有问题的,但是如果开发人员在URL中引用了它,例如 echo "<link rel='stylesheet'href='https:​//example.com$generated_css'>";,就会产生错误。你发现了吗?虽然这在Windows上可以工作,但对于其他人来说,$generated_css 中将是正斜杠而不是反斜杠,导致编码百分比、不存在的URL https://example.com%5cgenerated_css!当使用 DIRECTORY_SEPARATOR 时,必须特别小心,确保你的文件路径变量永远不会出现在URL中。

  • 最后,在不太可能的情况下,您的文件路径被非 PHP 代码使用 - 例如,在 shell_exec 调用中 - 您将无法混合斜杠,并且需要使用 DIRECTORY_SEPARATOR 构造文件路径或使用 realpath


  • 3
    我认为你在URL示例中弄反了:在Windows操作系统下,会创建一个反斜杠,该符号可能被编码为%5c。 - georaldc
    我的URL示例适用于除Windows之外的所有内容。 “虽然这在Windows上可以工作,但对于其他人来说...” - hostingutilities.com
    这应该是被接受的答案。主要是因为避免使用'DIRECTORY_SEPERATOR'更易读,其次因为有一些每个人都应该知道的陷阱。 - Jens Kohl

    4

    我从分发代码的经验中得知,在Linux和Windows上使你的应用程序运行最佳的方式是从不使用DIRECTORY_SEPARATOR或反斜杠\\,并且只使用正斜杠/

    为什么呢?因为反斜杠作为目录分隔符仅适用于Windows系统,而正斜杠则可适用于所有系统(Linux、Windows和Mac)。

    使用常量DIRECTORY_SEPARATOR或转义反斜杠\\会很快变得混乱。看看这个例子:

    $file = 'path' . DIRECTORY_SEPARATOR . 'to' . DIRECTORY_SEPARATOR . 'file';
    $file = str_replace('/', DIRECTORY_SEPARATOR, 'path/to/file';
    $file = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? 'path\\to\\file' : 'path/to/file';
    

    当你可以只做这个时:
    $file = 'path/to/file';
    

    唯一的缺点是,在Windows上使用 realpath()glob() 和魔术常量如 __FILE____DIR__ 等函数时,PHP 会返回反斜杠格式的文件路径。所以你可能需要使用 str_replace() 函数将它们替换为正斜杠,以保持一致性。

    $dir = str_replace('\\', '/', realpath('../'));
    

    我希望有一个php.ini设置,可以始终返回正斜杠。


    2
    不要使用自己的文件夹分隔符。始终使用DIRECTORY_SEPARATOR,因为:
    1. 在某些特殊情况下,您确实需要正确的路径分隔符。
    2. 操作系统可能会正确处理它,但许多第三方应用程序可能无法处理并可能失败!
    3. 有些操作系统不使用/\作为分隔符,而是使用其他字符。
    请记住:仅在远程系统上使用该常量 - 不要将其用于要发送到客户端的URI或任何其他内容(除非您确实需要,例如“远程浏览器”)。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接