我们都知道命名空间应用程序代码是最佳实践和PSR建议。 PSR采取立场的唯一方法就是功能及其声明时的空白和副作用。
但是那些与任何单一类无关的函数呢?它们应该是命名空间还是留在全局命名空间中?
一些开发人员说命名空间函数是不好的做法,但我无法理解为什么。
从我学习/阅读和推荐的关于命名空间函数的内容:
是否有全局功能和命名空间的最佳实践?目前我使用应用程序根命名空间来处理与全局应用程序相关的函数,但我一直在想为什么有些人强烈认为在对象(类,接口,特征等)之外不应该发生命名空间?
答案 0 :(得分:6)
命名空间是一个允许您在较小规模的构造上强加结构的概念。 使用命名空间,您可以将所有内容放在一起。这些东西是类还是函数并不重要。如果你有一个只与两个或三个特定类一起使用的自由函数,我肯定会把这个函数放在与类相同的命名空间中。
您是否想要使用免费功能是一个不同的问题。许多OO语言(如Java和C#)都不支持它们。但是有些情况下函数不适合类。在这些情况下,我更喜欢创建自由函数(在适当的命名空间中)。
话虽这么说,我很确定你也会在SO上得到YES和NO答案。因此,与您的团队讨论,并制定指南。
答案 1 :(得分:2)
[...]我一直想知道为什么有些人坚信没有命名空间 应该发生在对象(类,接口,特征等)之外?
对我来说,这是一个令人费解的想法。名称是名称。它不应该属于什么。
命名空间是名称的组织工具。在它们存在之前,人们经常使用诸如前缀之类的命名约定来避免冲突,例如ike_rsqrt
。命名空间采用这种约定并将其转换为正式的语言特性,通过这样做,除了提升更一致的方法之外,还允许一些额外的选项,如别名。
名称空间的好处适用于名称 - 只要存在可能与其他名称发生冲突的名称,名称所属的名称就不重要了。任何围绕名称空间的想法都会使问题复杂化,这可能会使问题复杂化。命名空间不是那么抽象,它们并不是那么神奇。而且他们的目的是为了通用目的。我们可能会在命名和封装以及内聚方面对它们进行研究,但即使在缺少命名空间的语言中采用基于前缀的约定时,这同样适用 - 大多数标识符不应仅仅免除此类组织因为它确定了什么。事情的组织方式是一个围绕凝聚力的有趣问题:事物是否应该根据他们的类型来组织。
名称是名称。命名空间旨在解决标识符冲突和组织问题,特别是在不同的代码库中。它表面上减少了它们的用处,表明它们只应用于一种标识符,而不是另一种标识符。
答案 2 :(得分:1)
但是与任何单个类无关的函数呢?
在我的代码中,我通常根本不使用纯PHP函数。我更喜欢静态的类方法。如果我有一些永远不需要任何状态的函数,我将它们按函数分组到一些静态类中,并将该类放入适当的命名空间。例如,\Util\Str::camelize()
或UI\Util\TextCleaner::prettifyHtml()
。
它们应该是命名空间还是留在全局命名空间中?
命名空间不仅可以解决名称冲突的问题。命名空间是最重要的目的:它有助于将应用程序切割成模块,这些模块在逻辑上是完整的,并且可以被开发人员理解为整体。模块应该遵循SRP本身。
所以,我相信你也应该命名空间函数。我认为没有功能,与项目中的任何内容无关,因此您可以将其放入全局命名空间。
否:不使用没有类的全局函数,因为它们不能 自动加载(这意味着创建支持静态类或 相似)。
我认为这是非常重要的原因。使用include()
污染代码并且容易出错。它覆盖了我们的项目愿景;)
否:不要使用全局功能,因为它们无法导入/使用(完全 始终需要合格的函数名称。
嗯,这对我来说也是一个合理的理由,虽然稍微不那么重要。我不希望在代码中使用完全限定名称来提高可读性。我倾向于创建具有强大内聚力的模块/类,以便为了可理解性而不需要长名称。
YES:将名称空间用于全局函数以防止冲突 表示不属于PHP本身的函数(您可以安全地使用 假设你正在调用正确的函数。)
我想这与软件设计有点无关。您应该专注于在整个应用程序中维护SOLID。不只是为了防止碰撞。如果您遵循SOLID,碰撞是......很好,很少见。
NO:不要将名称空间用于全局函数,因为函数 无论如何都不依赖于OO应用程序结构(有一点,但是 见前一点)。
我想这也是我已经扩展的一点。
是否有针对全局函数和命名空间的最佳实践?
是。但是不要指望我使用“使用它,不要使用它”。你不应该盲目地遵循你在互联网上遇到的一些语法最佳实践。面向对象的设计应该指导你的推理,而不是关于命名空间函数的一些教条规则。
嗯,我不知道。如果某些东西没有真正的状态,你就可以根据自己的喜好将它变成一个函数并命名它。但是函数命名空间对类命名空间有一些限制,所以我倾向于使用类。目前,我将应用程序根命名空间用于全局应用程序 相关的功能,但我一直在想为什么有些人强烈 相信在对象之外不应该发生命名空间(类, 接口,特征等)?