首页 > 解决方案 > DIRECTORY_SEPARATOR 的困境有什么解决办法?

问题描述

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

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';

还是不太好看……

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

标签: php

解决方案


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

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

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

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

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

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

    变成:

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


推荐阅读