我们应该在PHP中命名功能吗?

时间:2015-11-16 07:49:22

标签: php function architecture namespaces

我们都知道命名空间应用程序代码是最佳实践和PSR建议。 PSR采取立场的唯一方法就是功能及其声明时的空白和副作用。

但是那些与任何单一类无关的函数呢?它们应该是命名空间还是留在全局命名空间中?

一些开发人员说命名空间函数是不好的做法,但我无法理解为什么。

从我学习/阅读和推荐的关于命名空间函数的内容:

  • NO:不使用没有类的全局函数,因为它们无法自动加载(这意味着创建支持静态类或类似的东西)。
  • NO:不使用全局函数,因为它们无法导入/使用(总是需要完全限定的函数名称)。
  • 是:对全局函数使用名称空间来防止冲突并表示不属于PHP本身的函数(您可以放心地假设您正在调用正确的函数)。
  • 否:不要将名称空间用于全局函数,因为函数不依赖于OO应用程序结构(有一点,但请参见前一点)。

是否有全局功能和命名空间的最佳实践?目前我使用应用程序根命名空间来处理与全局应用程序相关的函数,但我一直在想为什么有些人强烈认为在对象(类,接口,特征等)之外不应该发生命名空间?

3 个答案:

答案 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应用程序结构(有一点,但是   见前一点)。

我想这也是我已经扩展的一点。

  

是否有针对全局函数和命名空间的最佳实践?

是。但是不要指望我使用“使用它,不要使用它”。你不应该盲目地遵循你在互联网上遇到的一些语法最佳实践。面向对象的设计应该指导你的推理,而不是关于命名空间函数的一些教条规则。

  

目前,我将应用程序根命名空间用于全局应用程序   相关的功能,但我一直在想为什么有些人强烈   相信在对象之外不应该发生命名空间(类,   接口,特征等)?

嗯,我不知道。如果某些东西没有真正的状态,你就可以根据自己的喜好将它变成一个函数并命名它。但是函数命名空间对类命名空间有一些限制,所以我倾向于使用类。