博客列表 >命名空间基础知识

命名空间基础知识

赵大叔
赵大叔原创
2020年05月07日 08:32:38916浏览

一、命名空间关键字和常用术语

1、namespace: 声明一个命名空间。
2、完全限定名称:总是从根空间开始,第一个字符一定是反斜线。
3、限定名称:成员名称前面至少要一个命名空间, 至少要有一个反斜线,且不能在首位。
4、非限定名称:成员前面不能有任何的命名空间,不能有反斜线。
5、导入:使用use关键字;别名:使用as关键字;。
6、::class:直接返回的完全限定的类名;__NAMESPACE__:直接返回的当前空间名称。

对于函数的常量,在当前空间找不到,会自动到全局空间下找。

三类命名空间:

  1. <?php
  2. namespace texhong\nhontrach;
  3. // 声明命名空间必须是程序脚本的第一条语句
  4. class Demo
  5. {
  6. const DEPART = 'texhong_phongnhansu';
  7. }
  8. namespace texhong\nganlong;
  9. class Demo
  10. {
  11. const DEPART = 'nganlong_phongnhansu';
  12. }
  13. namespace texhong;
  14. class Demo
  15. {
  16. const DEPART = 'phongnhansu';
  17. }
  18. // 非限定名称:只能访问当前空间下成员
  19. echo Demo::DEPART .'<br>';
  20. // 限定名称:在具的层级关系的空间下访问深层级的空间成员
  21. echo nganlong\Demo::DEPART .'<br>';
  22. // 完全限定名称:可以访问所有空间下成员
  23. echo \texhong\nhontrach\Demo::DEPART .'<br>';

演示效果图:

别名:

  1. <?php
  2. namespace texhong\nhontrach\xuatnhapkhau\nhanviengiayto;
  3. class Nhanvien
  4. {
  5. const NAME = 'cu';
  6. }
  7. namespace texhong\nhontrach\xuatnhapkhau\nhanviengiayto;
  8. class Chuquan
  9. {
  10. const NAME = 'hien';
  11. }
  12. // 1. 当要多次使用较长空间名称的时候,给空间起个别名会很方便
  13. // 给外部的空间起了一个别名
  14. use texhong\nhontrach\xuatnhapkhau\nhanviengiayto as tnxn;
  15. // 别名调用
  16. echo tnxn\Nhanvien::NAME .'<br>';
  17. echo tnxn\Chuquan::NAME .'<hr>';
  18. // 2. 类级的别名:空间名带上类名称
  19. use texhong\nhontrach\xuatnhapkhau\nhanviengiayto\Nhanvien as NH;
  20. echo NH::NAME .'<hr>';
  21. namespace test;
  22. // 当类别名和原名一样时,可以省略
  23. use texhong\nhontrach\xuatnhapkhau\nhanviengiayto\Nhanvien;
  24. echo Nhanvien::NAME .'<hr>';

演示效果图:

二、自动加载

其实就是通过封装一个函数,实现自动加载
命名空间必须和类文件所在的绝对路径一一对应
当前类名称与当前的类文件的名称完全一致

  1. // 自动加载器
  2. <?php
  3. try {
  4. // 注册自动加载
  5. spl_autoload_register(function($className){
  6. //1. 应该将类名中的命名空间的分隔符转为目录分隔符
  7. $path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
  8. // 2. 生成真正要加载的类文件名称
  9. $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  10. // 3. 加载这个文件
  11. require $file;
  12. });
  13. } catch (Exception $e) {
  14. die($e->getMessage());
  15. }
  16. // 使用自动加载
  17. namespace testAutoload;
  18. require 'autoload.php';
  19. use inc\lib\Demo1;
  20. use inc\lib\Demo2;
  21. use inc\lib\Demo3;
  22. echo Demo1::show() .'<hr>';
  23. echo Demo2::show() .'<hr>';
  24. echo Demo3::show() .'<hr>';

要加载文件目录:

演示效果图:

总结:

1、命名空间借鉴了传统的使用目录管理文件的方式, 来管理程序中的全局成员。
2、完全限定名称、非完全限定名称、非限定名称。(都是名称,也就是名字,相当于文件名。)
3、三者区别在于目录层级的深浅。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议