什么是命名空间以及如何在PHP中实现?

时间:2009-02-27 05:35:46

标签: php namespaces

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

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

4 个答案:

答案 0 :(得分:24)

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

假设您想要合并两个使用相同类名用户的项目,但每个项目的实现方式不同:

// 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版本,您将不得不为其中一个项目所使用的类用户的所有实例更改类名以避免命名冲突:

<?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
?>

了解更多信息:

答案 1 :(得分:3)

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

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

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

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

示例名称空间声明:

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

?>

答案 2 :(得分:3)

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

如果没有名称空间,如果你包含两个碰巧定义具有相同名称的函数/类的库(即两个库都包含一个名为'user'的类),它将失败。

由于PHP中没有名称空间支持,大多数库已经为其函数/类名称添加了可能唯一的名称,以避免名称冲突。麻烦的是,这会创建更长的函数或类名。

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

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.

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

以下将名为DbConnection的'别名'应用于Zend :: DB :: Connection。

use Zend::DB::Connection as DbConnection

答案 3 :(得分:1)

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