【问题标题】:What's the benefit of namespaces in PHP?PHP 中的命名空间有什么好处?
【发布时间】:2011-07-20 13:40:59
【问题描述】:

名称空间在 PHP 中有什么好处?我在多个 MVC 系统上工作过,但没有发现它们有多大用处。我在这里读到它们……这是我从未使用过的问题吗?它是一种始终可以使用的良好编码标准吗?

【问题讨论】:

  • 与任何其他语言命名空间的好处相同。限制或消除歧义。
  • 避免类名冲突
  • PHP 中假定的用例是类名别名和规避标识符内分组以解决层次结构和命名冲突。
  • 这是构建代码的一种很好的编码实践,但您并不总是需要使用它(例如,命名空间对于简单的脚本来说太过分了)。您从未使用过它们不是问题,因为它们仅在最新版本的 PHP 中可用,因此尚未广泛使用。

标签: php namespaces


【解决方案1】:

它还可以帮助您的代码更加灵活和清晰。 在比较中,Zend_Database_Adapter_Mysql 与 Zend/Database/Adapter/Mysql 是等价的,避免了歧义。

 // use namespace
 use Zend/Database/Adapter/Mysql as DbAdapter;
 $dbAdapter = new DbAdapter;

 // use naming convention    
 $dbAdapter = new Zend/Database/Adapter/Mysql;

在使用命名空间时,如果更改了适配器,您的代码不会被修改太多。所有动作都只是修改“使用”命令。 请注意,在示例中,不应关心工厂方法模式。

【讨论】:

    【解决方案2】:

    命名空间的主要优势通常不是来自您自己的应用程序代码,而是来自第三方库。库维护者可以为自己的代码选择合适的命名空间,并确保与您自己的代码没有命名冲突。

    【讨论】:

      【解决方案3】:

      命名空间是良好 OOP 实践的一部分。它们在大型 Web 应用程序中非常有用,因为它们有助于避免类之间的歧义。这是一种组织应用程序并使其更具可读性的方法。

      【讨论】:

        【解决方案4】:

        假设您有一个庞大的代码库,其中包含数千个函数、类和大量第三方代码。而现在,两个函数恰好同名。

        这就是命名空间的用武之地 - 通过将代码包装到命名空间中,您可以消除名称冲突的可能性。

        此外,命名空间可帮助您构建代码 - 属于某个功能或子系统的所有内容都进入一个命名空间。

        【讨论】:

          【解决方案5】:

          与任何其他语言一样,命名空间允许模棱两可的名称/具有相同名称的类共存,同时位于两个不同的命名空间中。

          例如Table 类可以引用持久数据库中的表和HTML 表。我可以将命名空间专门用于我想要的确切表,即分别为\Model\Table\View\Table

          【讨论】:

          • 命名空间是否必须有这样的斜线,或者你可以随意调用命名空间吗?
          • 大多数其他语言使用:: 之类的东西来做命名空间。 PHP 选择反斜杠的原因有很多,除了开发人员之外,大多数人都认为这很疯狂。由于妥协,该页面已关闭 ATM,但其原因通常在此处列出:wiki.php.net/rfc/namespaceseparator
          • C# 和 Java 使用 . 作为命名空间而不是反斜杠。 PHP 不能使用::,因为该运算符已经用于识别静态方法。
          • @thephpdeveloper:有趣的是,C# 和 Java 使用 . 作为命名空间/包、实例成员类成员。
          • 恕我直言,我认为使用. 会更加一致,但开发人员无法确定名称是类名、命名空间还是对类成员的引用。
          【解决方案6】:

          它可以帮助您避免名称冲突。例如,如果您有两个包,并且每个包都有一个名为 Client 的类(或类似的通用类),那么它将导致名称冲突。在 PHP 5.3 之前,避免这些冲突的解决方案是使用这样的类名:VendorName_PackageName_Classname

          如您所见,它不太好。但是现在使用 PHP 5.3,您可以使用命名空间来获得更简洁的类名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-09
            • 2012-05-16
            • 2015-05-16
            • 2016-12-28
            • 2011-01-20
            • 2018-03-06
            相关资源
            最近更新 更多