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

ale*_*lex 6 php namespaces

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

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

Jak*_*raw 24

命名空间是一种用于组织变量,函数和类的编程语言机制.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?
?>
Run Code Online (Sandbox Code Playgroud)

对于PHP小于5.3的版本,你就必须要经过的类的所有实例改变类名的麻烦用户通过防止命名冲突的一个项目中使用:

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

对于大于或等于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
?>
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息: