解决DIRECTORY_SEPARATOR困境的方法是什么?

时间:2019-11-01 02:26:27

标签: php

我目前在我的每个脚本的顶部执行此操作:

require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'interal' . DIRECTORY_SEPARATOR . 'kickstart.php';

kickstart.php启动我自己制作的PHP框架/库。我曾经这样做:

require_once __DIR__ . '/../../../interal/kickstart.php';

看起来好一百万倍,对吧?最重要的是,Windows理解/目录分隔符,甚至在同一路径中混合了/和\,所以一切都是黄金,不是吗?我们所有人都可以使用可爱的/,它也与浏览器中的URL一致!好极了!一切都很美丽,合乎逻辑且很好...

除非存在该变量DIRECTORY_SEPARATOR常数,否则该常数将转换为/或\或可能取决于操作系统的其他名称。就像PHP_EOL根据操作系统变成\ r \ n,\ n或\ r一样。

这主要是 错误 。您可以认为这是愚蠢的/愚蠢的/疯狂的,但确实确实使我感到无语。我竟然将整个代码中的每个路径都转化为使用DIRECTORY_SEPARATOR。现在,我有“正确的”代码,但是看起来非常难看。关于这一点,我是真正的“围墙”。我可以平等地看到双方。

如果有一个不基于Windows或Unix的新操作系统,并且为了摆脱各种传统的疯狂而竭尽全力地变得与众不同,会发生什么?如果使用#或。或用于分隔目录的内容?假设将PHP移植到此新操作系统,则所有不使用DIRECTORY_SEPARATOR的现有PHP代码都将中断!

(也许我如此担心的真正原因是,我希望出现这样的操作系统,因为我讨厌现有的操作系​​统。)

最好的事情是什么?我知道大多数人可能会说“只使用/”,但是由于常量存在,所以我不能这样做。我想到了要创建自己的常量,该常量是DIRECTORY_SEPARATOR的别名,也许叫做DS:

define('DS', DIRECTORY_SEPARATOR);

require_once __DIR__ . DS . '..' . DS . '..' . DS . '..' . DS . 'interal' . DS . 'kickstart.php';

还是不太漂亮...

很高兴听到一些严肃而有见地的想法。理想情况下,有一种我没有想到的方法可以以正确,看起来不错且易于输入的方式巧妙地解决这个难题。

3 个答案:

答案 0 :(得分:0)

您还可以创建一个辅助函数,以在操作系统更改时将“ /”替换为“ \”,比较DIRECTORY_SEPARATOR常量是否不同于您选择的默认值。

答案 1 :(得分:0)

使用join

$path = join(DIRECTORY_SEPARATOR, array('root', 'lib', 'file.php');

来自https://www.php.net/manual/en/dir.constants.php

答案 2 :(得分:0)

如果一个新的操作系统决定使用完全不同的文件系统约定,则您将根本无法编译任何现有软件以在其上运行,包括PHP解释器。除非目标操作系统已经提供了某种适当的兼容性子系统,否则将软件移植到新的操作系统是一项非常耗时的工作,需要明确完成。简而言之:

  • 全新的操作系统问世,PHP无法运行:您无能为力。
  • 全新的操作系统问世,PHP运行起来:希望您不需要做任何事情。

关于我认为的根本问题是(难以编写和规范化路径),您可以尝试一些其他技术:

  • 坚持使用/作为编码约定,因为它既简洁又是唯一的跨平台语法。

  • 考虑用dirname()的第二个参数替换..来简化相对路径。

    require_once __DIR__ . '/../../../interal/kickstart.php';
    

    成为:

    require_once dirname(__DIR__, 3) . '/interal/kickstart.php';
    
  • 在需要打印输出以供用户使用或进行比较时,请使用realpath()将路径归一化。它还可以很好地说明Windows共享中的驱动器号和\\SHARENAME前缀。 (此方法仅适用于实际存在的路径。)

相关问题