博客列表 >了解命名空间和类的自动加载(0729)

了解命名空间和类的自动加载(0729)

丶久而旧之丶
丶久而旧之丶原创
2020年08月31日 22:22:58567浏览

命名空间

声明和调用

  • 全局成员(函数,常量,类/接口)

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

  1. <?php
  2. // 命名空间
  3. namespace ns1;
  4. class Demo
  5. {
  6. public static function get()
  7. {
  8. return 'PHP';
  9. }
  10. }
  11. function f1($name)
  12. {
  13. return '你好' . $name;
  14. }
  15. // 命名空间2
  16. namespace ns2;
  17. class Demo
  18. {
  19. public static function get()
  20. {
  21. return 'PHP中文网';
  22. }
  23. }
  24. // 调用ns1空间中的类和函数
  25. echo \ns1\Demo::get() . '<br>' . \ns1\f1('小熊猫') . '<hr>';
  26. // 调用本空间类
  27. echo Demo::get();

全局空间

  • 如何有全局空间,那么全局成员的声明不应该放在全局空间中,应该放在命名空间中
  • 全局空间中主要写对全局成员的调用
  1. <?php
  2. namespace ns1 {
  3. class Demo
  4. {
  5. public static function get()
  6. {
  7. return 'PHP';
  8. }
  9. }
  10. function f1($name)
  11. {
  12. return '你好' . $name;
  13. }
  14. }
  15. namespace ns2 {
  16. class Demo
  17. {
  18. public static function get()
  19. {
  20. return 'PHP中文网';
  21. }
  22. }
  23. }
  24. namespace {
  25. echo ns1\Demo::get() . '<br>';
  26. echo ns2\Demo::get();
  27. }

在空间中访问类和函数

  • 访问函数时,如果本空间没有同名函数的声明,那么会在全局中寻找调用
  • 访问类时必须加上命名空间除非在本空间中有同名类的声明
  • 如果命名空间内有和系统内置的同名函数,那么调用系统内置函数时需要加上全局空间标识符‘\’
  1. <?php
  2. // 在空间中访问类和函数的区别
  3. namespace ns1 {
  4. // 访问函数时,如果本空间没有同名函数的声明,那么会在全局中寻找调用
  5. echo f1('小熊猫');
  6. // 访问类时必须加上命名空间除非在本空间中有同名类的声明
  7. echo \Demo::get();
  8. }
  9. namespace ns2 {
  10. class Demo
  11. {
  12. public static function get()
  13. {
  14. return 'PHP中文网';
  15. }
  16. }
  17. }
  18. namespace {
  19. class Demo
  20. {
  21. public static function get()
  22. {
  23. return 'PHP';
  24. }
  25. }
  26. function f1($name)
  27. {
  28. return '你好' . $name;
  29. }
  30. }

命名空间的别名

  • 完全限定名称—总是从全局空间标识符开始‘\’比如(\a\b…)
  • 限定名称— 有一个或多个空间但是不从全局空间开始比如(a\b…)
  • 非限定名称— 没有空间名称
  1. <?php
  2. namespace ns1;
  3. class Demo
  4. {
  5. public static function get()
  6. {
  7. return 'ns1空间---' . self::class;
  8. }
  9. }
  10. namespace ns2;
  11. class Demo
  12. {
  13. public static function get()
  14. {
  15. return 'ns2空间---' . self::class;
  16. }
  17. }
  18. // 使用完全限定名称访问
  19. echo \ns1\Demo::get() . '<hr>';
  20. // 使用限定名称访问
  21. echo nns1\Demo::get() . '<hr>';
  22. // 使用非限定名称(也就是访问本空间内的成员)
  23. echo Demo::get();
  24. namespace ns2\nns1;
  25. class Demo
  26. {
  27. public static function get()
  28. {
  29. return 'nns1空间---' . self::class;
  30. }
  31. }
  32. // 别名访问
  33. namespace ns3;
  34. // 空间级的别名(给空间起别名)
  35. use \ns1 as ns;
  36. echo '空间级别名访问:' . ns\Demo::get() . '<hr>';
  37. // 类级别名
  38. use \ns2\Demo as nn;
  39. echo '类级别名访问:' . nn::get() . '<hr>';
  40. // 如果起的别名和类名相同和省略as和后面的别名(如果本空间中有同名类 那么就不能省略)
  41. use \ns2\nns1\Demo;
  42. echo '别名和类名相同访问:' . Demo::get() . '<hr>';

自动加载

类文件

  1. <?php
  2. namespace inc\lib;
  3. class Test1
  4. {
  5. public static function get()
  6. {
  7. return 11111;
  8. }
  9. function hello($name)
  10. {
  11. return 'hello' . $name;
  12. }
  13. }
  14. function hello($name)
  15. {
  16. return 'hello' . $name;
  17. }

自动加载类文件

  1. <?php
  2. try {
  3. spl_autoload_register(function ($class) {
  4. // 把分隔符转为系统的目录分隔符
  5. $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
  6. // 获取文件名
  7. $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  8. // 判断文件是否存在
  9. if (!(is_file($file) && file_exists($file)))
  10. throw new \Exception('文件名不存在');
  11. require $file;
  12. });
  13. } catch (Exception $e) {
  14. die($e->getMessage());
  15. }
  16. // 直接调用文件中的类
  17. echo inc\lib\Test1::get();
  18. // 引入文件
  19. new inc\lib\Test1;
  20. echo '<hr>';
  21. // 调用文件中的方法
  22. echo inc\lib\hello('小熊猫');

总结

1.对于命名空间有了一些了解
2.了解了类的自动加载

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