博主信息
博文 59
粉丝 6
评论 0
访问量 67455
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
完全限定,限定与非限定类名称、类的自动加载-php-30课7.29
希望
原创
943人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学