什么时候在PHP代码中使用DIRECTORY_SEPARATOR?

tan*_*eng 14 php

看看PHP代码:

require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';
Run Code Online (Sandbox Code Playgroud)

上面的代码来自wordpress的插件.

我不明白为什么有一半使用DIRECTORY_SEPARATOR,但另一半使用"/"?

wp-*_*com 8

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

  • 当您打印出文件路径并且混合了\和时,它可能看起来很丑陋且令人困惑/。如果DIRECTORY_SEPARATOR使用,这将永远不会发生

  • 使用诸如此类的东西$generated_css = DIRECTORY_SEPARATOR.'minified.css';对于文件 IO 来说一切正常且花哨,但是如果开发人员在不知不觉中在诸如 的 URL 中引用了它,那么就会产生一个错误。你懂了吗?虽然这会在Windows上工作,其他人正斜杠,而不是反斜杠,将在,导致百分比编码,不存在的,URL https://example.com %5C generated_css!使用 a 时,您必须特别小心,以确保您的文件路径变量永远不会出现在 URL 中。echo "<link rel='stylesheet'href='https:​//example.com$generated_css'>";$generated_cssDIRECTORY_SEPARATOR

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

  • 我认为您的 URL 示例正好相反:在 Windows 上,将创建一个反斜杠,可以将其编码为 %5c (2认同)

Jus*_*nas 6

因为在不同的操作系统中存在不同的目录分隔符。在Windows中,\在Linux中/DIRECTORY_SEPARATOR与该OS目录分隔符保持一致。每次在路径中使用它。

在您的代码段中,我们清楚地看到了不良实践代码。如果framework / cms被广泛使用,并不意味着它正在使用最佳实践代码。

  • 好的,那为什么以后相同的代码在同一行中显式地使用`/`? (2认同)
  • 是的,这就是OP想要知道的,这是否只是一种不好的做法,或者将两者放在同一条线上是否有任何目的?您的评论实际上是该问题的一种可能答案。 (2认同)
  • 我认为没有必要使用常量。我一直在路径中使用`/`,它们在Windows和Unix上均可使用。我认为PHP足够聪明,可以进行转换。 (2认同)
  • 不过,在 WordPress 代码中使用“DIRECTORY_SEPARATOR”并没有多大意义,因为 WordPress 的内置函数不使用它,它们只是使用正斜杠(有点不一致,就像正在讨论的代码中一样)。在 WordPress 中,您只需要混合使用正斜杠和反斜杠作为目录分隔符即可。但对于框架之外的 PHP,或者至少在 WordPress 之外,我认为你是对的,`DIRECTORY_SEPARATOR` 是最好的。请参阅 https://cmljnelson.wordpress.com/2018/07/26/which-way-do-your-slashes-face/ (2认同)
  • 所有 io 函数都将根据所使用的操作系统在内部转换斜杠。无需使用 DIRECTORY_SEPARATOR(除非将文件路径传递给非 PHP 代码的情况)。事实上,它甚至可能会在 URL 中造成意想不到的副作用,正如 Julian 在 https://dev.to/c33s/always-use--as-directory-seperator-in-php-43l7 中指出的那样 (2认同)

tim*_*tim 5

我从分发代码中了解到,应用程序在 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';
Run Code Online (Sandbox Code Playgroud)

当你可以这样做时:

$file = 'path/to/file';
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是在 Windows 上;PHP 将为来自realpath()、等函数glob()以及 和 等魔术常量__FILE__的所有文件引用返回反斜杠__DIR__。因此,您可能需要将str_replace()它们放入正斜杠以保持一致。

$dir = str_replace('\\', '/', realpath('../'));
Run Code Online (Sandbox Code Playgroud)

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