博主信息
博文 64
粉丝 6
评论 2
访问量 102119
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
php 命名空间的使用和类的自动加载
王娇
原创
894人浏览过

学习总结

  • 不同的命名空间可以定义相同名称的类、接口、函数、常量
  • 通过空间的别名可以简化代码
  • 可以把具有特殊功能的类封装在类文件中进行自动加载

1.命名空间的定义

  1. <?php
  2. //清华大学
  3. namespace nQhdx//不同的命名空间可以存在相同的类,函数,接口,常量
  4. {
  5. class StuInfo
  6. {
  7. private $school = '清华大学';
  8. private $dep = '计算机科学与应用';
  9. private $classes = '04-08';
  10. public function printSDC()
  11. {
  12. echo '班名:',$this ->classes,'<br>';
  13. echo '系名:',$this ->dep,'<br>';
  14. echo '校名:',$this ->school,'<br>';
  15. echo '<hr>';
  16. }
  17. }
  18. //访问当前空间中的类和类中的方法,可省略当前空间名称:非限定名称
  19. $stu = new StuInfo();
  20. $stu ->printSDC();
  21. }
  22. //人民大学
  23. namespace nRmdx
  24. {
  25. class StuInfo
  26. {
  27. private $school = '人民大学';
  28. private $dep = '计算机科学与应用';
  29. private $classes = '04-08';
  30. public function printSDC()
  31. {
  32. echo '班名:',$this ->classes,'<br>';
  33. echo '系名:',$this ->dep,'<br>';
  34. echo '校名:',$this ->school,'<br>';
  35. echo '<hr>';
  36. }
  37. }
  38. //访问当前空间中的类和类中的方法,可省略当前空间名称:非限定名称
  39. $stu = new StuInfo();
  40. $stu ->printSDC();
  41. //访问另一个空间是的类需要使用:完全限定名称以“\”开头+空间名称+类名
  42. echo '***********访问另一个空间的类***************','<br>';
  43. $stu1 =new \nQhdx\StuInfo();
  44. $stu1 ->printSDC();
  45. }
  46. //北京大学
  47. namespace nBjdx
  48. {
  49. class School
  50. {
  51. private $school = '北京大学';
  52. public function printSchool()
  53. {
  54. //访问具有层级关系的空间时
  55. //$dep = new Computer\StuInfo();代表访问的是当前空间下的Computer空间下的StuInof类
  56. $dep = new Computer\StuInfo();
  57. $dep->printSDC();
  58. echo '校名:',$this ->school,'<br>';
  59. echo '<hr>';
  60. }
  61. }
  62. $stu = new School();
  63. $stu -> printSchool();
  64. }
  65. namespace nBjdx\Computer
  66. {
  67. class StuInfo
  68. {
  69. private $dep = '计算机科学与应用';
  70. private $classes = '04-08';
  71. public function printSDC()
  72. {
  73. echo '班名:',$this ->classes,'<br>';
  74. echo '系名:',$this ->dep,'<br>';
  75. }
  76. }
  77. }
  78. ?>
  • 代码运行效果

2.命名空间的别名

  1. <?php
  2. //清华大学
  3. namespace nQhdx//不同的命名空间可以存在相同的类,函数,接口,常量
  4. {
  5. class StuInfo
  6. {
  7. private $school = '清华大学';
  8. private $dep = '计算机科学与应用';
  9. private $classes = '04-08';
  10. public function printSDC()
  11. {
  12. echo '班名:',$this ->classes,'<br>';
  13. echo '系名:',$this ->dep,'<br>';
  14. echo '校名:',$this ->school,'<br>';
  15. echo '<hr>';
  16. }
  17. }
  18. }
  19. //人民大学
  20. namespace nRmdx
  21. {
  22. class StuInfo
  23. {
  24. private $school = '人民大学';
  25. private $dep = '计算机科学与应用';
  26. private $classes = '04-08';
  27. public function printSDC()
  28. {
  29. echo '班名:',$this ->classes,'<br>';
  30. echo '系名:',$this ->dep,'<br>';
  31. echo '校名:',$this ->school,'<br>';
  32. echo '<hr>';
  33. }
  34. }
  35. }
  36. //北京大学
  37. namespace nBjdx
  38. {
  39. class StuInfo
  40. {
  41. private $school = '北京大学';
  42. private $dep = '计算机科学与应用';
  43. private $classes = '04-08';
  44. public function printSDC()
  45. {
  46. echo '班名:',$this ->classes,'<br>';
  47. echo '系名:',$this ->dep,'<br>';
  48. echo '校名:',$this ->school,'<br>';
  49. echo '<hr>';
  50. }
  51. }
  52. }
  53. namespace nSchool
  54. {
  55. //使用空间别名,可以简化代码
  56. use \nQhdx\StuInfo as qStu;
  57. use \nRmdx\StuInfo as rStu;
  58. use \nBjdx\StuInfo as bStu;
  59. $stu1 = new qStu();//通过空间别名访问该空间中的类
  60. $stu1 ->printSDC();
  61. $stu2 = new rStu();
  62. $stu2 ->printSDC();
  63. $stu3 = new bStu();
  64. $stu3 ->printSDC();
  65. }
  66. ?>
  • 代码运行效果

3.类的自动加载

  • 最终实现的类
  1. <?php
  2. require 'autoLoad.php';
  3. //通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
  4. //如果想使用原始类中的名称则不需要加as关键字
  5. use stuInfo\school\Qhdx;
  6. //通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
  7. use stuInfo\school\Rmdx;
  8. //通过autoLoad.php中的自动加载器,在使用Qhdx类的时候自动加载
  9. use stuInfo\school\Bjdx;
  10. //类已经通过自动加载器加载成功,可直接使用
  11. $stu1 = new Qhdx();
  12. $stu1 ->printSDC();
  13. $stu2 = new Rmdx();
  14. $stu2 ->printSDC();
  15. $stu3 = new Bjdx();
  16. $stu3 ->printSDC();
  17. ?>
  • 想要自动加载的类文件Bjdx.php
  1. <?php
  2. //北京大学
  3. //要实现自动加载,
  4. //1.空间名称必须和类文件所在的路径一一对应
  5. //2.文件名必须与类名相同
  6. namespace stuInfo\school
  7. {
  8. class Bjdx
  9. {
  10. private $school = '北京大学';
  11. private $dep = '计算机科学与应用';
  12. private $classes = '04-08';
  13. public function printSDC()
  14. {
  15. echo '班名:',$this ->classes,'<br>';
  16. echo '系名:',$this ->dep,'<br>';
  17. echo '校名:',$this ->school,'<br>';
  18. echo '<hr>';
  19. }
  20. }
  21. }
  22. ?>
  • 自动加载器的实现autoLoad.php
  1. <?php
  2. try
  3. {
  4. spl_autoload_register(function($className){
  5. //DIRECTORY_SEPARATOR返回当前系统的目录分隔符
  6. //将空间中的分隔符替换成当前系统的目录分隔符
  7. $path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
  8. //__DIR__返回当前文件所在路径
  9. //生成要加载的类文件名称
  10. $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  11. // 3. 加载这个文件
  12. require $file;
  13. });
  14. }
  15. catch(Exception $e)
  16. {
  17. $e->getMessage();
  18. }
  19. ?>
  • 当前类文件所在的目录结构

  • 代码运行效果

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:有了命名空间, 就不再担心全局成员的命名冲突了,包括引入的第三方组件,这是促进php组件化开发的基石, 可以说, 现代php就靠它实现华丽转身
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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

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