Blogger Information
Blog 59
fans 6
comment 0
visits 51900
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
完全限定,限定与非限定类名称、类的自动加载-php-30课7.29
希望
Original
797 people have browsed it

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”
  • 类的自动加载可以跨目录访问
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:总结的好
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments