博客列表 >命名空间:完全限定、限定与非限定实例与类自动加载器

命名空间:完全限定、限定与非限定实例与类自动加载器

零龙
零龙原创
2020年08月08日 03:19:29694浏览

命名空间 namespace

PHP 命名空间可以解决以下两类问题:

  • 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

1、非限定名称:省略空间名称,使用默认或当前的命名空间
2、完全限定名称:类似绝对目录,从全局空间的反斜线开始’\’
3、限定名称:前面必须添加全局空间才可访问

示例:

  1. <?php
  2. namespace test;
  3. const USER_NAME = '曹操';
  4. function info()
  5. {
  6. return '魏国人';
  7. }
  8. class Demo
  9. {
  10. public static function nation()
  11. {
  12. return USER_NAME.'->魏国人!';
  13. }
  14. }
  15. echo '1、非限定名称:省略空间名称,使用默认或当前的命名空间';
  16. echo '<hr>';
  17. echo USER_NAME;
  18. echo '<hr>';
  19. echo info();
  20. echo '<hr>';
  21. echo Demo::nation();
  22. echo '<hr>';
  23. echo '当前命名空间: ',__NAMESPACE__,'<hr>';
  24. echo '2、完全限定名称:类似绝对目录,从全局空间的反斜线开始';
  25. namespace test\demo\show\index\test;
  26. const USER_NAME = '刘备';
  27. function info()
  28. {
  29. return '蜀国';
  30. }
  31. class Demo
  32. {
  33. public static function nation()
  34. {
  35. return USER_NAME.'->魏国人!';
  36. }
  37. }
  38. echo '<hr>';
  39. echo \test\demo\show\index\test\USER_NAME;
  40. echo '<hr>';
  41. echo \test\demo\show\index\test\info();
  42. echo '<hr>';
  43. echo \test\demo\show\index\test\Demo::nation();
  44. echo '<hr>';
  45. echo '当前命名空间: ',__NAMESPACE__,'<hr>';
  46. use test\demo\show\index\test as show;
  47. echo show\USER_NAME;
  48. echo show\info();
  49. echo show\Demo::nation();
  50. echo '<hr>';
  51. echo '3、限定名称:前面必须添加全局空间才可访问';
  52. namespace test\demo\show\index;
  53. echo test\USER_NAME;
  54. echo '<hr>';
  55. echo test\info();
  56. echo '<hr>';
  57. echo test\Demo::nation();
  58. echo '<hr>';
  59. echo '当前命名空间: ',__NAMESPACE__,'<hr>';

示例图

总结:完全限制:从全局开始,类似绝对路径。
限定名称:添加了全局空间才可以使用。类似相对路径
非限定名称:类似类访问当前的空间。

PHP类自动加载器

自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来。
自动加载可以说是现代PHP框架的根基,任何牛逼的框架或者架构都会用到它,它发明出来的理由是啥呢?一个字:懒。因为项目越来愈大,相关联的类库文件越来越多,我们不可能再像小项目那样在一个文件中全部手动一个一个require

示例

  1. <?php
  2. try {
  3. spl_autoload_register(function($class){
  4. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  5. $file = __DIR__. DIRECTORY_SEPARATOR.$path.'.php';
  6. if(!(is_file($file) && file_exists($file)))
  7. //判断$file是不是一个文件和存不存在
  8. {
  9. throw new \Exception('不是文件或者文件不存在');
  10. }
  11. require $file;
  12. });
  13. } catch (Exception $e){
  14. die($e->getMessage());
  15. }
  16. use bin\lib\Test;
  17. use bin\lib\Test1;
  18. use bin\lib\Test2;
  19. use bin\lib\Test3;
  20. echo Test::class;
  21. echo"<br>";
  22. echo Test1::class;
  23. echo"<br>";
  24. echo Test2::class;
  25. echo"<br>";
  26. echo Test3::class;

示例图:

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