命名空间的定义和访问方法

命名空间就相当于是一个内存中虚拟的存放文件的路径。
举例:

  1. <?php
  2. namespace php;
  3. class obj {
  4. public $num = 10 ;
  5. }

这是使用namespace关键词声明的一个命名空间,名称为php,如果不声明任何命名空间的话,系统默认为全局空间,也就是当前空间为根路径,当声明后,这个类就相当于被存在了虚拟路径 /php下面
如何使用?

  1. <?php
  2. #相当于取出\php文件夹下的obj类
  3. $obj = new \php\obj();

命名空间中的三个名称的术语如下所示:

1.非限定名称,或不包含前缀的类名称,例如 $comment = new Comment();。如果当前命
名空间是Blog\Article,Comment将被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

2.限定名称,或包含前缀的名称,例如 $comment = new Article\Comment();。如果当前的命名空间是Blog,则Comment会被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new \Article\Comment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)Article\Comment。

其实可以把这三种名称类比为文件名(例如 comment.php)、相对路径名(例如 ./article/comment.php)、绝对路径名(例如 /blog/article/comment.php),这样可能会更容易理解。

在这里创建一个Blog 空间,使用非限定名称,表示当前Blog空间,实例化以后这个调用将被解析。使用限定名称,表示相对于Blog空间,实例化以后这个调用将被解析成 Blog\Article\Comment(),注意类前面没有反斜线。使用完全限定名称,表示绝对于Blog空间,实例化以后这个调用将被解析,注意类前面有反斜线和没有反斜线区别。

其示例代码如下所示:

  1. //创建空间Blog
  2. namespace Blog;
  3. class Comment { }
  4. //非限定名称,表示当前Blog空间
  5. //这个调用将被解析成 Blog\Comment();
  6. $blog_comment = new Comment();
  7. //限定名称,表示相对于Blog空间
  8. //这个调用将被解析成 Blog\Article\Comment();
  9. $article_comment = new Article\Comment(); //类前面没有反斜杆\
  10. //完全限定名称,表示绝对于Blog空间
  11. //这个调用将被解析成 Blog\Comment();
  12. $article_comment = new \Blog\Comment(); //类前面有反斜杆\
  13. /
  14. /完全限定名称,表示绝对于Blog空间
  15. //这个调用将被解析成 Blog\Article\Comment();
  16. $article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\
  17. //创建Blog的子空间Article
  18. namespace Blog\Article;
  19. class Comment { }
  20. ?>

命名空间的引入

关键词use 可以帮助省略我们每次初始化新类时繁琐的各种限定空间名称声明,在我们使用类时可提前使用use关键词引入空间类(默认),也可以引入常量和方法,需要在use后面声明类型;
示例:

  1. use app\controller\index; //引入类 默认
  2. use function app\controller\dsiplay //引入方法
  3. use conts app\controller\IP; //引入常量