我目前在我的每个脚本的顶部执行此操作:
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';
还是不太漂亮...
很高兴听到一些严肃而有见地的想法。理想情况下,有一种我没有想到的方法可以以正确,看起来不错且易于输入的方式巧妙地解决这个难题。
答案 0 :(得分:0)
您还可以创建一个辅助函数,以在操作系统更改时将“ /”替换为“ \”,比较DIRECTORY_SEPARATOR常量是否不同于您选择的默认值。
答案 1 :(得分:0)
使用join
$path = join(DIRECTORY_SEPARATOR, array('root', 'lib', 'file.php');
答案 2 :(得分:0)
如果一个新的操作系统决定使用完全不同的文件系统约定,则您将根本无法编译任何现有软件以在其上运行,包括PHP解释器。除非目标操作系统已经提供了某种适当的兼容性子系统,否则将软件移植到新的操作系统是一项非常耗时的工作,需要明确完成。简而言之:
关于我认为的根本问题是(难以编写和规范化路径),您可以尝试一些其他技术:
坚持使用/
作为编码约定,因为它既简洁又是唯一的跨平台语法。
考虑用dirname()的第二个参数替换..
来简化相对路径。
require_once __DIR__ . '/../../../interal/kickstart.php';
成为:
require_once dirname(__DIR__, 3) . '/interal/kickstart.php';
在需要打印输出以供用户使用或进行比较时,请使用realpath()将路径归一化。它还可以很好地说明Windows共享中的驱动器号和\\SHARENAME
前缀。 (此方法仅适用于实际存在的路径。)