Blogger Information
Blog 32
fans 0
comment 0
visits 27779
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP命名空间和自动加载原理
Yang_Sir
Original
819 people have browsed it

使用命名空间,避免引入第三类库时的类或函数命名冲突
命名空间与类的文件路径一致,就可以实现类的自动加载

1.命名空间

  • 使用namespace关键字为当前代码段创建命名空间
  • 每个空间都是独立的,不同命名空间就算在同一文件中也可以创建同名方法和类

1.1 命名空间中元素的访问

  • 1.非限定名称,不包含路径访问当前命名空间中的元素,
  • 2.限定名称,当要访问的元素在当前空间的下级空间时可以省略当前空间名,似相对路径
  • 3.完全限定名称,访问另一空间中的元素时,需要从根空间开始访问

homework.php

  1. <?php
  2. //命名空间
  3. //访问命名空间中元素的几种方式
  4. namespace phpstudy\second;
  5. function getFileName(){
  6. return __NAMESPACE__;
  7. }
  8. namespace phpstudy\first\first;
  9. function getFileName(){
  10. return __NAMESPACE__;
  11. }
  12. namespace phpstudy\first;
  13. class Demo{
  14. protected const FILE_NAME = 'homework.php';
  15. public static function getFileName(){
  16. return self::FILE_NAME;
  17. }
  18. }
  19. //1.非限定名称,不包含路径访问当前命名空间中的元素,
  20. echo demo::getFileName(),'<br>';//homework.php
  21. //2.限定名称,当要访问的元素在当前空间的下级空间时可以省略当前空间名,似相对路径
  22. echo first\getFileName();//phpstudy\first\first
  23. //3.完全限定名称,访问另一空间中的元素时,需要重根空间开始访问
  24. echo \phpstudy\second\getFileName();//phpstudy\second

1.2 命名空间和类的别名

  • 可以为命名空间和类起别名,省去重复写命名空间路径和避免类名重复

homework.php 续

  1. include 'test1.php';
  2. amespace phpstudy\fourth;
  3. class Demo{
  4. }
  5. //声明命名空间别名
  6. use phpstudy\first as first;
  7. //使用命名空间别名访问
  8. echo first\Demo::getFileName();//homework.php
  9. //存在类名重复时可以为引用的命名空间中类起别名,
  10. use phpstudy\first\Demo as Test;
  11. //使用类别名访问,不需要路径
  12. echo Test::getFileName();//homework.php

2. 自动加载

  • spl_autoload_register方法,当new一个不存在的类时自动调用注册的函数
  • 使文件名与类名一致,再使用该方法加上requireinclude包含文件,就可以实现自动加载类文件了

示例:

  1. <?php
  2. //注册到自动装载函数队列中
  3. try{
  4. spl_autoload_register(function($calssname){
  5. $calssname = str_replace('\\',DIRECTORY_SEPARATOR,$calssname);
  6. $file = __DIR__.DIRECTORY_SEPARATOR.$calssname.'.php';
  7. require($file);
  8. },true);
  9. }catch(\Exception $e){
  10. die($e->getMessage());
  11. }
  12. //同级目录下创建有 Test.php文件,文件中有个Test类
  13. use \Test;
  14. //调用Test类时自动加载了Test文件
  15. echo Test::index();//输出:当前方法:Test::index

Test.php

  1. <?php
  2. namespace {
  3. class Test
  4. {
  5. public static function index()
  6. {
  7. return '当前方法:'.__METHOD__;
  8. }
  9. }
  10. }
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
Author's latest blog post