Blogger Information
Blog 64
fans 6
comment 2
visits 82829
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php 命名空间的使用和类的自动加载
王娇
Original
659 people have browsed it

学习总结

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

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

  • 代码运行效果

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:有了命名空间, 就不再担心全局成员的命名冲突了,包括引入的第三方组件,这是促进php组件化开发的基石, 可以说, 现代php就靠它实现华丽转身
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
Author's latest blog post