require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';
上面的代码来自于WordPress的一个插件。
我不明白为什么有一半用了DIRECTORY_SEPARATOR
,而另一半用了"/"
?
require_once dirname(__FILE__).DIRECTORY_SEPARATOR . './../../../wp-config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';
上面的代码来自于WordPress的一个插件。
我不明白为什么有一半用了DIRECTORY_SEPARATOR
,而另一半用了"/"
?
\
,在 Linux 中是/
。DIRECTORY_SEPARATOR
是具有该操作系统目录分隔符的常量。在路径中每次使用它。/
? - Hanky PankyDIRECTORY_SEPARATOR
没有太多意义,因为WordPress的内置函数不使用它,它们只使用正斜杠(有点不一致,就像正在讨论的代码一样)。在WordPress中,您只需要期望将正斜杠和反斜杠混合使用作为目录分隔符。
但是对于PHP框架之外的代码,或者至少是WordPress之外的代码,我认为您是正确的,最好使用DIRECTORY_SEPARATOR
。请参见https://cmljnelson.wordpress.com/2018/07/26/which-way-do-your-slashes-face/ - thespacecamel所有的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。
我从分发代码的经验中得知,在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设置,可以始终返回正斜杠。
DIRECTORY_SEPARATOR
,因为:
/
或\
作为分隔符,而是使用其他字符。