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

命名空间和自动加载

王佳祥
王佳祥原创
2020年07月30日 15:14:36579浏览

命名空间和自动加载

一、命名空间基础

  • 全局成员:写在函数外部的东西

  • 全局成员有四个:函数,常量,类,接口

  • 全局成员最大特点:不能重复命名

  • namespace关键字来定义命名空间

  1. <?php
  2. //命名空间A
  3. namespace A;
  4. //接口
  5. interface iTest
  6. {
  7. public function getSite();
  8. }
  9. //类
  10. class Demo implements iTest
  11. {
  12. public function getSite()
  13. {
  14. return 'php中文网';
  15. }
  16. }
  17. //函数
  18. function f1(iTest $obj){
  19. return $obj->getSite();
  20. }
  21. //输出
  22. echo '函数输出'.f1(new Demo).'<br>';
  23. echo '类输出'.(new Demo)->getSite().'<hr>';
  24. /*———————————————————————————————————————————————————————————————————————————————— */
  25. //命名空间B
  26. namespace B;
  27. //在B命名空间中访问A命名空间中的类方法
  28. echo '命名空间B调用getSite()方法'.(new \A\Demo)->getSite().'<br>';
  29. //调用函数
  30. echo \A\f1(new \A\Demo);


  • 查看类全名用双冒号::
  1. <?php
  2. namespace one
  3. {
  4. class Demo
  5. {
  6. public function getSite()
  7. {
  8. return 'php中文网';
  9. }
  10. }
  11. }
  12. /*************************************************************************/
  13. namespace two
  14. {
  15. echo (new \one\Demo)->getSite().'<br>';
  16. //查看当前类全名
  17. echo '当前类全名:'.two::class.'<br>';
  18. echo '查看one的类全名:'.\one\Demo::class.'<br>';
  19. class D{}
  20. echo D::class;
  21. }
  22. /*************************************************************************/
  23. //全局匿名空间
  24. namespace
  25. {
  26. //因为有了全局匿名空间,那么全局成员的声明就不应该放在全局,而应该放在空间中
  27. //因此,全局空间应该主要写对全局对象的调用
  28. echo '<br>'.(new one\Demo)->getSite();
  29. }
  30. /*************************************************************************/


  • 如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数
  1. <?php
  2. //在空间中访问类与访问函数有什么区别
  3. namespace one
  4. {
  5. //访问类
  6. echo \Test::NAME.'<hr>';
  7. function var_dump($name)
  8. {
  9. echo 'HELLO 你好?****'.$name;
  10. }
  11. //如果调用的函数与系统内置的函数重名,则优先调用当前空间的函数
  12. //只有在当前空间找不到这个函数,再到全局中去找
  13. var_dump(\Test::NAME);
  14. echo '<br>';
  15. \var_dump(\Test::NAME);
  16. }
  17. //全局
  18. namespace
  19. {
  20. class Test
  21. {
  22. const NAME = 'PHP中文网';
  23. }
  24. }


  • 命名空间的别名
  1. <?php
  2. //命名空间的别名
  3. namespace one;
  4. class Demo{}
  5. /**********************************************************/
  6. namespace two;
  7. class Demo{}
  8. /**********************************************************/
  9. namespace three;
  10. //访问one::Demo
  11. //从全局空间开始访问,完全限定名称的类
  12. echo \one\Demo::class.'<br>';
  13. //类名可以省略掉与当前空间名称重复的部分
  14. //限定名称的类:不从全局空间开始访问
  15. echo A\Hello::class,'<br>';
  16. class Work{}
  17. //3.访问当前空间中的类成员,不要添加空间名称
  18. //非限定名称的类:Work
  19. echo Work::class.'<br>';
  20. echo \one\Demo::class.'<br>';
  21. //使用空间或类的别名来简化这种调用
  22. //空间级的别名:给空间起个别名,使用关键字use
  23. //主要是针对完全限定名称的类起的别名
  24. use \one as I;
  25. echo '别名访问:'. I\Demo::class,'<br>';
  26. //2.类级的别名,给完全限定名称的类起个别名
  27. use \two\Demo as R;
  28. echo '别名访问:' .R::class.'<br>';
  29. //如果别名和类名相同,可以省略as后面的别名
  30. //use \one\Demo as Demo;
  31. //use \one\Demo;
  32. //如果当前类中也有一个与之同名的非限定的类,就不能省略别名
  33. class Demo{}
  34. use \one\Demo as em;
  35. echo '别名访问:' .em::class;
  36. /**********************************************************/
  37. namespace three\A;
  38. class Hello{}
  39. //完全限定名称:从全局空间开始,前面总是由一个"\"
  40. //限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始
  41. //非限定名称:就是不带有空间名称的类


二、类的自动加载

  • spl_autoload_register():注册给定的函数作为 __autoload 的实现
  1. spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
参数 描述
autoload_function 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw 此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
  1. <?php
  2. //__DIR__
  3. //echo __DIR__,'\\demo7.php';
  4. echo __DIR__.'<hr>';
  5. //require __DIR__ . '\\inc\\lib\\Test1.php';
  6. //echo \inc\lib\Test1::class,'<br>';
  7. //str_replace(目标值,替换值,执行替换的数组或者字符串,替换次数)
  8. $path = str_replace('\\',DIRECTORY_SEPARATOR,'\inc\lib\Test1');
  9. echo DIRECTORY_SEPARATOR.'<br>';
  10. echo $path.'<hr>';
  11. require __DIR__ .$path .'.php';
  12. //echo __DIR__ . $path . '.php';
  13. echo Test1::class;
  1. <?php
  2. //类的自动加载
  3. try{
  4. spl_autoload_register(function($class){
  5. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  6. $file = __DIR__ . $path.'.php';
  7. if(!(is_file($file) && file_exists($file)))
  8. throw new \Exception('不是文件或文件不存在');
  9. require $file;
  10. });
  11. }catch(Exception $e){
  12. die($e->getMessage());
  13. }
  14. use inc\lib\Test1;
  15. use inc\lib\Test2;
  16. use inc\lib\Test3;
  17. echo Test1::class.'<br>';
  18. echo Test2::class.'<br>';
  19. echo Test3::class.'<br>';


三、学习总结

  • 用namespace关键字来定义命名空间

  • 命名空间分为完全限定名称,限定名称和非限定名称

  • 完全限定名称:从全局空间开始,前面总是由一个”\”

  • 限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始

  • 非限定名称:就是不带有空间名称的类

  • 别名的使用:use 命名空间名称 as 自定义名称

  • 类的自动加载:用spl_autoload_register()函数

  • 对类的自动加载有了初步认识,就是sql_autoload_register()这个函数有点难理解,不知道这个$class这个变量的值具体是怎么赋值的,我的理解是使用use时把命名空间名称赋值给$class

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