【问题标题】:What is a namespace and how is it implemented in PHP?什么是命名空间,它是如何在 PHP 中实现的?
【发布时间】:2010-10-10 06:23:59
【问题描述】:

我听说最新的 PHP 支持命名空间。我知道在全局范围内定义的变量有 no 命名空间,那么如何在不同的命名空间中创建变量呢?

它只是对变量/函数进行分类的一种方式吗?

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    命名空间通常与库一起使用,使用 1 个单独的命名空间引用库代码的能力有助于不破坏已经在使用的其他库代码。

    【讨论】:

      【解决方案2】:

      namespace 允许您组织代码并为您提供封装项目的方法。

      您可以将命名空间可视化为文件系统使用目录对相关文件进行分组。

      基本上,命名空间为您提供了一种对相关类、函数和常量进行分组的方法。

      它们还有助于避免 PHP 类/函数/常量之间的名称冲突,并提高代码可读性,避免过长的类名。

      命名空间声明示例:

      <?php
      namespace MyProject;
      
      const CONNECT_OK = 1;
      class Connection { /* ... */ }
      function connect() { /* ... */  }
      
      ?>
      

      【讨论】:

      • 所以对于一堆字符串辅助函数,我应该把它们从类中的静态函数中取出来做命名空间字符串;函数匹配(){}等?
      【解决方案3】:

      命名空间解决了从库中导入类和函数时的命名冲突问题。

      如果没有命名空间,如果您包含两个库,而这两个库恰好定义了同名的函数/类(即,两个库都包含一个名为“用户”的类),它将失败。

      由于 PHP 中不支持命名空间,大多数库已采取在其函数/类名称前加上可能是唯一的前缀,以避免名称冲突。问题是,这会创建更长的函数或类名。

      here 给出的示例属于异常类:

      PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.
      

      您可以使用“AS”关键字(您选择的名称)将长名称空间作为别名导入您自己的本地范围。因此,您仍然可以在本地范围内选择一个简短的类名。

      下面将一个名为 DbConnection 的“别名”应用到 Zend::DB::Connection。

      use Zend::DB::Connection as DbConnection
      

      【讨论】:

        【解决方案4】:

        命名空间是一种用于组织变量、函数和类的编程语言机制。 PHP 5.3 增加了对命名空间的支持,我将在下面的示例中进行演示:

        假设您想合并两个项目,它们使用相同的类名 User,但每个项目都有不同的实现:

        // Code for Project One (proj1.php)
        <?php
          class User {
            protected $userId;
            public function getUserId() {
              return $this->userId;
            }
          }
          $user = new User;
          echo $user->getUserId();
        ?>
        
        // Code for Project Two (proj2.php)
        <?php
          class User {
            public $user_id;
          }
          $user = new User;
          echo $user->user_id;
        ?>
        
        <?php
          // Combine the two projects
          require 'proj1.php';
          require 'proj2.php'; // Naming collision!
          $myUser = new User; // Which class to use?
        ?>
        

        对于低于 5.3 的 PHP 版本,您将不得不为其中一个项目使用的 User 类的所有实例更改类名,以防止命名冲突:

        <?php
          class ProjectOne_User {
            // ...
          }
          $user = new ProjectOne_User; // Code in Project One has to be changed too
        ?>
        

        对于大于或等于 5.3 的 PHP 版本,您可以在创建项目时使用命名空间,方法是添加命名空间声明:

        <?php
          // Code for Project One (proj1.php)
          namespace ProjectOne;
          class User {
            // ...
          }
          $user = new User;
        ?>
        
        <?php
          // Combine the two projects
          require 'proj1.php';
        
          use ProjectOne as One; // Declare namespace to use
        
          require 'proj2.php' // No collision!
        
          $user = new \One\User; // State which version of User class to use (using fully qualified namespace)
        
          echo $user->user_id; // Use ProjectOne implementation
        ?>
        

        更多信息:

        【讨论】:

        • 同意。干的很好。我只是希望他们在命名空间和类之间使用不同的分隔符。 :(
        • 整个分隔符都在抱怨:如果你只使用单引号字符串,我对php中的每个字符串都使用单引号字符串,但换行符除外
        • 很好的例子和解释,我完全不知道命名空间的作用,php.net 根本没有帮助,但你的回答有帮助,谢谢 +1
        • 更新:命名空间分隔符恰好是 \ 而不是 ::
        猜你喜欢
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        相关资源
        最近更新 更多