为什么在PSR-0标准中将下划线转换为目录分隔符


Why is underscore converted to directory separator in the PSR-0 standard?

PSR-0(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)标准规定类名中的下划线应转换为相应文件名中的目录分隔符。

对我来说,这似乎不是一个好主意,因为当一个不知道标准的人无辜地在类名中使用下划线时,自动加载器突然找不到类,并且出现了各种奇怪的错误,这会产生很多错误(例如,请参阅这个stackerflow问题:Symfony2.1映射错误:class_parents())

所以我想这个"特性"一定有某种原因(与某个库的历史兼容性?)。我的问题是:有人知道为什么在PSR-0标准中引入这一点吗?

Undercores是在PHP还不支持名称空间的时代使用的。一个"正确"组织的项目遵循与目录结构相同的文件命名规则。

这只是在项目中组织文件的一些通用"规则"。

因此,如果您的目录结构为:

root
  Name
    Package
      MyClass.php

人们曾经做过:

class Name_Package_MyClass {}

但现在我们有了名称空间,它就变成了:

namespace Name'Package;
class MyClass { }

这只是编码风格的指导原则,确保每个人都做同样的事情。

因此,PSR-0所做的是将旧的和新的名称空间样式映射到一个文件名。

PHP自5.3版本起支持命名空间,早期最常见的约定是使用下划线作为命名空间(目录)分隔符,例如:My_Project_ClassName映射为/path/to/my/My/Project/ClassName。我认为向后兼容性是主要原因。

请记住,PSR-0标准是为一些特定项目编写的,不一定是您自己项目的最佳选择。正如他们网站上所说:"如果其他人想采用我们正在做的事情,欢迎他们这样做,但这不是目的。"PSR-0非常严格,我不会因为其他人这样做就选择使用它。考虑一下你真正想要从你的项目中得到什么,以及它是否对你有利。