php - 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 运行:希望您无需做任何事情。
关于我认为根本问题是(难以编写和非规范化路径),您可以尝试一些其他技术:
坚持
/
作为编码约定,因为它既简洁又是唯一的跨平台语法。考虑用
..
dirname ()的第二个参数替换以简化相对路径。require_once __DIR__ . '/../../../interal/kickstart.php';
变成:
require_once dirname(__DIR__, 3) . '/interal/kickstart.php';
每当您需要为用户打印路径或进行比较时,使用realpath()规范化路径。它还很好地说明
\\SHARENAME
了 Windows 共享中的驱动器号和前缀。(此方法仅适用于实际存在的路径。)
推荐阅读
- parallel-processing - 使用 cuda 并行执行乘法和加法
- android - 如何使用 socket.io 发送 multipart/form-data?
- parameters - Power BI 中以 0 开头的整数作为参数
- deep-learning - 在pytorch中,如何使用F.cross_entropy()中的权重参数?
- java - 如何正确使用 writeUTF() 方法?
- python - 在python中将字符串转换为整数时保持零位保存
- google-analytics - 用户 ID 增加了 GA 中的用户数
- php - 带有条件和自定义错误消息的 Laravel 规则
- python - 在 CentOS7 中,AttributeError: module 'socketio' has no attribute 'Server'
- javascript - 从 txt 文件中删除一行