博客列表 >PHP命名空间和自动加载原理

PHP命名空间和自动加载原理

Yang_Sir
Yang_Sir原创
2020年05月07日 17:11:15817浏览

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

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