博客列表 >完全限定,限定与非限定类名称、类的自动加载-php-30课7.29

完全限定,限定与非限定类名称、类的自动加载-php-30课7.29

希望
希望原创
2020年07月31日 11:56:10796浏览

1.完全限定,限定,非限定,三种类名称

  1. <?php
  2. // 完全限定名称的类名,限定名称的类名,非限定名称的类名
  3. // 命名空间的别名
  4. namespace ns1;
  5. class T1 {}
  6. namespace ns2;
  7. class T1 {}
  8. namespace ns3;
  9. // 访问ns1里的T1
  10. // 从当前空间开始访问另一个空间,应该从全局开始
  11. // ns1\T1:完全限定名称的类名,类似绝对路径,从根开始
  12. echo \ns1\T1::class;
  13. echo '<hr>';
  14. // 访问ns3\sub::Hello,完全限定名称的类名
  15. echo \ns3\sub\Hello::class;
  16. echo '<hr>';
  17. // 可以省略当前类名相同的部分ns3, \ns3\去掉也是一样的结果,这叫限定名称的类名,类似相对路径
  18. echo sub\Hello::class;
  19. echo '<hr>';
  20. // 访问当前空间类成员,不用加类名称ns3,不需要 echo ns3\Work::class;
  21. // 非限定名称的类
  22. class Work {}
  23. echo Work::class;
  24. echo '<hr>';
  25. // 访问ns2里的T1,用完全限定访问
  26. echo \ns2\T1::class;
  27. echo '<hr>';
  28. // 简化:访问ns2里的T1。先给空间起个别名,关键字use
  29. use \ns2 as S;
  30. echo '别名访问:' . S\T1::class;
  31. // use后的关键字必须是完全限定名称的空间或类
  32. echo '<hr>';
  33. // 给完全限定名称的类起个别名,
  34. use \ns2\T1 as Test;
  35. echo '别名访问:' . Test::class;
  36. echo '<hr>';
  37. // 如果别名和类名相同
  38. // use \ns2\T1 as T1;
  39. // 上面的T1类名一样了,用下面方法一样,可以省略as后面的别名
  40. use \ns2\T1;
  41. echo '别名访问:' . T1::class;
  42. echo '<hr>';
  43. // 哪种情况下不能省略别名呢? 别名相同时,就不能省略
  44. use \ns2\T1 as TT;
  45. echo '别名访问:' . TT::class;
  46. namespace ns3\sub;
  47. class Hello {}

2.类的自动加载

  • 准备:建两个文件目录:inc,lib,包含关系,在lib目录下建3个文件:Test1,Test2,Test3
  1. <?php
  2. // 当前类的命名空间与当前类的文件路径对应
  3. namespace inc\lib;
  4. // 类名与当前类文件名称相同
  5. class Test1{}
  1. <?php
  2. namespace inc\lib;
  3. class Test2{}
  1. <?php
  2. namespace inc\lib;
  3. class Test3{}
  • 在根目录下建一个新文件demo8.php
  1. <?php
  2. // 类的自动加载
  3. spl_autoload_register(function($class){
  4. // 文件路径
  5. $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
  6. // 文件名
  7. $file = __DIR__ .DIRECTORY_SEPARATOR .$path. '.php';
  8. require $file;
  9. });
  10. echo inc\lib\Test1::class;
  11. echo '<hr>';
  12. try {
  13. spl_autoload_register(function($class){
  14. // 文件路径
  15. $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
  16. // 文件名
  17. $file = __DIR__ .DIRECTORY_SEPARATOR .$path. '.php';
  18. // 加载异常测试,判断它是个文件,文件必须存在
  19. if (!(is_file($file) && file_exists($file)))
  20. throw new \Exception('不是文件或文件不存在');
  21. require $file;
  22. });
  23. } catch (Exception $e) {
  24. die($e->getMessage());
  25. }
  26. use inc\lib\Test1;
  27. use inc\lib\Test2;
  28. use inc\lib\Test3;
  29. echo Test1::class,'<br>';
  30. echo Test2::class,'<br>';
  31. echo Test3::class,'<br>';
  • 总结:
  • 完全限定名称: 可以看作是绝对路径,总是从全局空间开始, 前面总是一个: “\” , “\A\B…”
  • 限定名称: 可以看作是相对路径,类名总是会有一个或多个空间名称,但不是从全局开始, “A\B…”
  • 非限定名称: 当前类里的成员,就是不带有空间名称的类 “ User”
  • 类的自动加载可以跨目录访问
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议