博客列表 >php 命名空间的使用和类的自动加载

php 命名空间的使用和类的自动加载

王娇
王娇原创
2020年05月06日 16:59:11670浏览

学习总结

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

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. ?>
  • 当前类文件所在的目录结构

  • 代码运行效果

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