【问题标题】:PHP directory separators, forcing forward slash; non-intrusivePHP 目录分隔符,强制正斜杠;非侵入式
【发布时间】:2011-12-31 00:20:22
【问题描述】:

每当我使用 PHP(经常)我通常在 Windows 机器上工作,但是我(尝试)开发与平台无关的应用程序;一个主要问题是目录分隔符的使用。

正如许多人所知,在 PHP 中在 Windows 环境中执行任何文件系统工作时,您可以使用正斜杠代替反斜杠,PHP 会在后台对其进行排序。当涉及到使用字符串文字将路径传递给fopen() 或其他任何东西时,这一切都很好;但是在检索路径时,无论是__FILE__ 还是使用realpath() 扩展,检索到的路径当然是使用操作系统适当的斜杠。此外,我注意到尾随斜杠有一些不一致之处。一次或两次__DIR__ 附加了一个(反斜杠)和realpath() 也(我更喜欢尾部斜杠,但不是间歇性的

这显然是字符串比较的问题,因为不是这样做:

compare_somehow('path/to/file.php', __DIR__);

为了可靠,我得走了:

compare_somehow('path/to/file.php', rtrim(strtr(__DIR__, '\\', '/'), '/') . '/');

这似乎需要做很多工作。当然,我可以将它放入一个函数中;现在我在所有 OO 代码中都被任意函数依赖所困扰。

我知道 PHP 并不完美,需要进行调整,但肯定存在一些与平台无关的解决方法来强制文件系统命中以检索正斜杠路径,或者至少是一种非侵入性的方式来引入一个类- 用于此目的的独立函数。

总结问题(s):

  • 是否有一些神奇的(虽然可靠)变通方法、hack 或其他方式来强制 PHP 退回正斜杠文件系统路径,而不管服务器操作系统如何?
  • 我将假设上述问题的答案是,所以继续往下看;我可以做出哪些规定来强制使用正斜杠( 或任何选择,真的)作为目录分隔符?我假设通过上述过滤功能,但现在应该去哪里?

所有的正斜杠。即使主机操作系统分隔符是#*&@

【问题讨论】:

  • 你看过DIRECTORY_SEPARATOR吗?
  • @vascowhite - 当然有。但是,我看不出它有什么好处。 'path'.DS.'to'.DS.'file.php' 如果我将其别名为 DS 但即使这样也很痛苦。此外,用户提供的路径(配置文件等)仍然需要为strtr()-ed 或自己使用DIRECTORY_SEPARATOR
  • 为什么要比较路径?您不能使用 PHP 的函数来测试文件或目录是否存在吗?那将与操作系统无关,不是吗?

标签: php path filesystems


【解决方案1】:

正如我评论的那样,我真的不明白你为什么必须这样做(我有兴趣快速描述你正在解决的具体问题),但这里有一个使用 @987654322 输出的可能解决方案以@为例:-

$path = str_replace('\\', '/', __FILE__);

See it working

无论操作系统返回的 * 斜杠如何(我认为),这都会(应该?)工作。

不幸的是,除此之外,我不知道“一些神奇的(尽管可靠的)解决方法、黑客攻击或以其他方式强制 PHP 向前踢回斜线文件系统路径,而不管服务器操作系统如何”。我想它可以被包装在一个辅助类中,但这仍然会给你的代码带来任意依赖。

【讨论】:

  • 感谢@vascowhite - 我已经在这个时候将上述功能包装在一个帮助类中(连同其他相关函数),这样所有的东西都是正斜杠的,并且目录总是尾随斜线。
  • 另外,关于您的评论;可以这么说,我一直在对“虚拟目录”进行比较。我会在问题中详细说明。
  • 我刚刚使用了一个辅助类。 Path::normalize($path, $expand); 通过realpath() 进行可选扩展。它将DIRECTORY_SEPARATOR 规范化为/,将/ 附加到目录,并且(通过可选的布尔参数)将在执行规范化之前扩展路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2020-11-10
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多