html5中文学习网

您的位置: 首页 > 网络编程 > PHP编程 » 正文

PHP中的命名空间详细介绍_php教程

[ ] 已经帮助:人解决问题

   这篇文章主要介绍了PHP中的命名空间详细介绍,本文讲解了命名空间(namespace)的概念、正在使用命名空间、定义命名空间、子命名空间、从命名空间中调用代码等内容,需要的朋友可以参考下bKvHTML5中文学习网 - HTML5先行者学习网

  概述bKvHTML5中文学习网 - HTML5先行者学习网

  PHP对于命名空间的支持,经历了一段艰难的旅程。幸运的是,PHP从5.3开始引入了命名空间。自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善。许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了。不管如何,每一种新特性的引入都有其目的,和其他语言一样,PHP引入命名空间也主要是为了解决名字冲突的问题。bKvHTML5中文学习网 - HTML5先行者学习网

  命名空间(namespace)的概念bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  当在字符串中使用命名空间名字的时候,一定不要忘了转义/bKvHTML5中文学习网 - HTML5先行者学习网

  可以将命名空间想象成一个抽屉,你可以在抽屉里放入铅笔、尺子、A4纸等,这些都是你自己的私有物品。在你的抽屉下面是别人的抽屉,别人也可以在抽屉里放入相同的物品。为了不拿错物品,你们决定在自己的抽屉上贴上标签,这样就可以清晰的看到某个物品是属于谁的了。bKvHTML5中文学习网 - HTML5先行者学习网

  之前,开发者必须在类、函数和常量中添加下划线,用来使自己的代码独立其他于代码库。这相当于所有人都给自己的物品贴上标签之后,一起放入了一个更大的抽屉里。尽管这也是一种组织代码的方式,但是这种方式是非常低效的。bKvHTML5中文学习网 - HTML5先行者学习网

  命名空间的到来就是为了解决这个问题。我们可以在不同的命名空间里声明相同的函数、类和常量,而不会造成名字上的冲突。本质上,命名空间无非是一种分等级标记PHP代码的方式。bKvHTML5中文学习网 - HTML5先行者学习网

  正在使用命名空间bKvHTML5中文学习网 - HTML5先行者学习网

  有一点需要注意的是,我们正在间接的使用命名空间。从PHP 5.3开始,所有在非用户定义的命名空间中的声明(类、函数、常量),都默认的属于全局命名空间。bKvHTML5中文学习网 - HTML5先行者学习网

  全局命名空间中包含了所有PHP内部的定义,如echo()、mysqli_connect()和Exception类。由于全局命名空间并没有独立的标识名,所以它经常被成为全局空间(global space)。bKvHTML5中文学习网 - HTML5先行者学习网

  定义命名空间bKvHTML5中文学习网 - HTML5先行者学习网

  命名空间的定义必须是PHP文件的第一条语句。唯一允许在定义命名空间之前使用的语句是declare语句。bKvHTML5中文学习网 - HTML5先行者学习网

  定义命名空间很简单,只需要使用关键字namespace即可。命名空间的名字需要遵循PHP文件中其他标识符的命名规则。bKvHTML5中文学习网 - HTML5先行者学习网

  下面是定义一个命名空间的示例:bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyNamespace{bKvHTML5中文学习网 - HTML5先行者学习网

  class Test{bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  如果想定义一个属于全局空间的代码块,也是使用namespace关键字,但是后面不加命名空间的名字,如下:bKvHTML5中文学习网 - HTML5先行者学习网

  代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  namespace {bKvHTML5中文学习网 - HTML5先行者学习网

  class Test{bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  我们甚至可以在一个文件中定义多个命名空间,如下:bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyNamespace {bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MySecondNamespace {bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  namespace {bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  我们也可以将一个命名空间分散在不同的文件中,文件包含的处理程序会自动合并他们。因此,限制大量的命名空间在同一个文件中定义是一个很好的编程实践,就像我们通常单独为每个类定义一个单独的文件一样。bKvHTML5中文学习网 - HTML5先行者学习网

  复制代码 代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  有一点需要注意的是,包含命名空间代码块的{是可选的,可以用也可以不用。事实上,只要我们坚持在一个文件中只定义一个命名空间,那么我们就可以完全省略{,这样也可以使我们的代码看起来更加简洁。bKvHTML5中文学习网 - HTML5先行者学习网

  子命名空间bKvHTML5中文学习网 - HTML5先行者学习网

  命名空间可以遵循一个特定的层级,就像我们电脑文件系统中得目录一样。子命名空间对于将一个项目结构化尤其特别有用。例如,你的项目需要访问数据库,你可能会想将所有数据库相关的代码(如数据库异常处理等)放在同一个子目录下。bKvHTML5中文学习网 - HTML5先行者学习网

  为了保持灵活性,将子命名空间放在子目录中是非常明智的做法。这会使你的代码结构更清晰,而且会使遵循PSR-0标准的autoloaders的使用变得更容易。bKvHTML5中文学习网 - HTML5先行者学习网

  PHP使用反斜线/作为命名空间的分隔符,有趣的是,PHP甚至考虑过使用笑脸:)作为命名空间的分隔符。bKvHTML5中文学习网 - HTML5先行者学习网

  子命名空间定义示例:bKvHTML5中文学习网 - HTML5先行者学习网

  代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject/DatabasebKvHTML5中文学习网 - HTML5先行者学习网

  class Connection {bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  可以使用尽可能多的子命名空间:bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject/Blog/Auth/Handler/Social;bKvHTML5中文学习网 - HTML5先行者学习网

  class Twitter {bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  有一点需要注意的是,PHP并不支持命名空间的嵌套定义,下面的代码会导致一个致命错误:Namespace declarations cannot be nested。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject {bKvHTML5中文学习网 - HTML5先行者学习网

  namespace Database {bKvHTML5中文学习网 - HTML5先行者学习网

  class Connection { }bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  从命名空间中调用代码bKvHTML5中文学习网 - HTML5先行者学习网

  如果你想在不同的命名空间中实例化一个类、调用一个函数或者使用常量,需要使用反斜线/。他们可以从三个角度被解析:bKvHTML5中文学习网 - HTML5先行者学习网

  1.未限定的名字bKvHTML5中文学习网 - HTML5先行者学习网

  2.限定的名字bKvHTML5中文学习网 - HTML5先行者学习网

  3.完全限定的名字bKvHTML5中文学习网 - HTML5先行者学习网

  未限定的名字(Unqualified Name)bKvHTML5中文学习网 - HTML5先行者学习网

  这是一个类的名称,函数或常量,但是不包括任何命名的引用。如果命名空间对你来说还比较陌生,那么这就是你熟悉的角度。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject;bKvHTML5中文学习网 - HTML5先行者学习网

  class MyClass {bKvHTML5中文学习网 - HTML5先行者学习网

  static function static_method()bKvHTML5中文学习网 - HTML5先行者学习网

  {bKvHTML5中文学习网 - HTML5先行者学习网

  echo 'Hello, world!';bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  // Unqualified name, resolves to the namespace you are currently in (MyProject/MyClass)bKvHTML5中文学习网 - HTML5先行者学习网

  MyClass:static_method();bKvHTML5中文学习网 - HTML5先行者学习网

  限定的名字(Qualified Name)bKvHTML5中文学习网 - HTML5先行者学习网

  这是我们如何使用子命名空间的方式。示例如下:bKvHTML5中文学习网 - HTML5先行者学习网

  代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject;bKvHTML5中文学习网 - HTML5先行者学习网

  require 'myproject/database/connection.php';bKvHTML5中文学习网 - HTML5先行者学习网

  // Qualified name, instantiating a class from a sub-namespace of MyProjectbKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new Database/Connection();bKvHTML5中文学习网 - HTML5先行者学习网

  完全限定的名字(Fully Qualified Name)bKvHTML5中文学习网 - HTML5先行者学习网

  前面所说的使用限定的名字和未限定的名字,都是相对于当前所处的命名空间来说的。以上两种方式仅可以被用来访问当前所处的命名空间和更深层次的子命名空间。bKvHTML5中文学习网 - HTML5先行者学习网

  如果想访问一个在比前命名空间更高的层级,那么就需要使用完全限定的名字—一个绝对路径而不是相对路径。这可以归结为在命名空间的最前面加反斜杠/。使用完全限定的名字可以让PHP知道,这次调用是从全局空间开始的,而不是相对于当前所处的命名空间。示例如下:bKvHTML5中文学习网 - HTML5先行者学习网

  代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject/Database;bKvHTML5中文学习网 - HTML5先行者学习网

  require 'myproject/fileaccess/input.php';bKvHTML5中文学习网 - HTML5先行者学习网

  // Trying to access the MyProject/FileAccess/Input classbKvHTML5中文学习网 - HTML5先行者学习网

  // This time it will work because we use the fully qualified name, note the leading backslashbKvHTML5中文学习网 - HTML5先行者学习网

  $input = new /MyProject/FileAccess/Input();bKvHTML5中文学习网 - HTML5先行者学习网

  对于PHP的内部函数来说,我们不必要使用完全限定的名字。在当前所处的命名空间中,调用一个不存在的未限定的名字的类或函数,PHP会搜索全局空间。bKvHTML5中文学习网 - HTML5先行者学习网

  记住了这个规则,我们就可以像下面那样重写PHP的内部函数:bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject;bKvHTML5中文学习网 - HTML5先行者学习网

  var_dump($query); // OverloadedbKvHTML5中文学习网 - HTML5先行者学习网

  /var_dump($query); // InternalbKvHTML5中文学习网 - HTML5先行者学习网

  // We want to access the global Exception classbKvHTML5中文学习网 - HTML5先行者学习网

  // The following will not work because there's no class called Exception in the MyProject/Database namespace and unqualified class names do not have a fallback to global spacebKvHTML5中文学习网 - HTML5先行者学习网

  // throw new Exception('Query failed!');bKvHTML5中文学习网 - HTML5先行者学习网

  // Instead, we use a single backslash to indicate we want to resolve from global spacebKvHTML5中文学习网 - HTML5先行者学习网

  throw new /Exception('ailed!');bKvHTML5中文学习网 - HTML5先行者学习网

  function var_dump() {bKvHTML5中文学习网 - HTML5先行者学习网

  echo 'Overloaded global var_dump()!bKvHTML5中文学习网 - HTML5先行者学习网
';bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  动态调用bKvHTML5中文学习网 - HTML5先行者学习网

  PHP是一门动态语言,也可以将PHP的这种特性用来调用命名空间。这在本质上与实例化一个变量类和包含一个变量文件是相同的。在字符串中,PHP使用的命名空间分隔符(/)也是一个元字符,因此需要转义。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace OtherProject;bKvHTML5中文学习网 - HTML5先行者学习网

  $project_name = 'MyProject';bKvHTML5中文学习网 - HTML5先行者学习网

  $package_name = 'Database';bKvHTML5中文学习网 - HTML5先行者学习网

  $class_name = 'Connection';bKvHTML5中文学习网 - HTML5先行者学习网

  // Include a variable filebKvHTML5中文学习网 - HTML5先行者学习网

  require strtolower($project_name . '/'. $package_name . '/' . $class_name) . '.php';bKvHTML5中文学习网 - HTML5先行者学习网

  // Name of a variable class in a variable namespace. Note how the backslash is escaped to use it properlybKvHTML5中文学习网 - HTML5先行者学习网

  $fully_qualified_name = $project_name . '//' . $package_name . '//' . $class_name;bKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new $fully_qualified_name();bKvHTML5中文学习网 - HTML5先行者学习网

  namespace关键字bKvHTML5中文学习网 - HTML5先行者学习网

  关键字namespace不仅仅可以用来定义一个命名空间,它也可以用来显示的表示当前命名空间,它此时的作用相当于类中的self关键字。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject;bKvHTML5中文学习网 - HTML5先行者学习网

  function run()bKvHTML5中文学习网 - HTML5先行者学习网

  {bKvHTML5中文学习网 - HTML5先行者学习网

  echo 'Running from a namespace!';bKvHTML5中文学习网 - HTML5先行者学习网

  }bKvHTML5中文学习网 - HTML5先行者学习网

  // Resolves to MyProject/runbKvHTML5中文学习网 - HTML5先行者学习网

  run();bKvHTML5中文学习网 - HTML5先行者学习网

  // Explicitly resolves to MyProject/runbKvHTML5中文学习网 - HTML5先行者学习网

  namespace/run();bKvHTML5中文学习网 - HTML5先行者学习网

  __NAMESPACE__常量bKvHTML5中文学习网 - HTML5先行者学习网

  就像self关键字不能表示当前类的名字一样,namespace关键字也不能用来表示当前命名空间的名字。__NAMESPACE__关键字就是用来解决这个问题的。bKvHTML5中文学习网 - HTML5先行者学习网

  代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace MyProject/Database;bKvHTML5中文学习网 - HTML5先行者学习网

  // 'MyProject/Database'bKvHTML5中文学习网 - HTML5先行者学习网

  echo __NAMESPACE__;bKvHTML5中文学习网 - HTML5先行者学习网

  这个关键字对于判断当前代码是否从命名空间开始时非常有用,而且也可以用来调试代码。bKvHTML5中文学习网 - HTML5先行者学习网

  导入或别名bKvHTML5中文学习网 - HTML5先行者学习网

  PHP中得命名空间也支持导入,导入也被成为别名。只有类、接口和命名空间可以被导入(别名)。导入是命名空间中一个非常有用和基础的功能。它使我们可以使用外部的代码包,而不用担心名字的冲突。使用use关键字可以实现导入功能。也可以使用as关键字,在导入的时候指定一个别名。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  use [name of class, interface or namespace] as [optional_custom_alias]bKvHTML5中文学习网 - HTML5先行者学习网

  一个完全限定的名字可以用一个未限定的别名来代替,这样我们就不用在每次使用的时候都使用完全限定的名字,达到简化代码的目的。导入应该在命名空间的最高层或者全局空间中使用,在函数作用域内使用导入功能是非法的语法。bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace OtherProject;bKvHTML5中文学习网 - HTML5先行者学习网

  // This holds the MyProject/Database namespace with a Connection class in itbKvHTML5中文学习网 - HTML5先行者学习网

  require 'myproject/database/connection.php';bKvHTML5中文学习网 - HTML5先行者学习网

  // If we want to access the database connection of MyProject, we need to use its fully qualified name as we're in a different name spacebKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new /MyProject/Database/Connection();bKvHTML5中文学习网 - HTML5先行者学习网

  // Import the Connection class (it works exactly the same with interfaces)bKvHTML5中文学习网 - HTML5先行者学习网

  use MyProject/Database/Connection;bKvHTML5中文学习网 - HTML5先行者学习网

  // Now this works too! Before the Connection class was aliased PHP would not have found an OtherProject/Connection classbKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new Connection();bKvHTML5中文学习网 - HTML5先行者学习网

  // Import the MyProject/Database namespacebKvHTML5中文学习网 - HTML5先行者学习网

  use MyProject/Database;bKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new Database/Connection()bKvHTML5中文学习网 - HTML5先行者学习网

  我们可以通过使用别名来简化上面的代码:bKvHTML5中文学习网 - HTML5先行者学习网

   代码如下:bKvHTML5中文学习网 - HTML5先行者学习网

  bKvHTML5中文学习网 - HTML5先行者学习网

  namespace OtherProject;bKvHTML5中文学习网 - HTML5先行者学习网

  require 'myproject/database/connection.php';bKvHTML5中文学习网 - HTML5先行者学习网

  use MyProject/Database/Connection as MyConnection;bKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new MyConnection();bKvHTML5中文学习网 - HTML5先行者学习网

  use MyProject/Database as MyDatabase;bKvHTML5中文学习网 - HTML5先行者学习网

  $connection = new MyDatabase/Connection();bKvHTML5中文学习网 - HTML5先行者学习网

  总结bKvHTML5中文学习网 - HTML5先行者学习网

  命名空间是用来避免定义冲突,并且为代码引入了更加灵活和组织的方式。有一点需要注意的时,我们并没有义务去使用命名空间,它是和面向对象结合使用的一种工作方式。但是,如果使用了命名空间,我们的代码可能会达到一种新的层次,逼格也会显得更高吧。

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助