细说命名空间/命名空间类的自动加载" class="reference-link">PHP:oop->细说命名空间/命名空间类的自动加载

一.命名空间

  • 命名空间:namespace 有名称的空间
  • namespace 需要写在脚本的顶部,必须是php的第一条指令(除了declare指令)
  • 全局成员: 常量,函数,类(接口),默认声明在全局空间中的
  • 优点:全局调用
  • 缺点:不能重复命名
  • php5.3以后引入C# Java中应用成熟的命名空间
  • use 在命名空间中的作用/导入命名空间
  • use app\admin\controller as app;
  • 引入别的命名空间到当前空间 为命名空间起别名
  • 引入别的命名空间中的类到当前空间使用, 为别的命名空间中的类起别名

相互访问" class="reference-link">①命名空间->相互访问

在第二个命名空间中找不到第一个命名空间里面的类,如果我们要进行访问则要用\斜杆进行指定空间查找,可以理解为路径查找

在two空间中访问one空间里的类, 应该使用”\”表示root空间(全局空间)

代码块

  1. <?php
  2. /**
  3. * namespace 需要写在脚本的顶部,必须是php的第一条指令(除了declare指令)
  4. *
  5. * namespace ns1;
  6. * namespace ns1{
  7. * }
  8. */
  9. //第一个命名空间
  10. namespace one
  11. {
  12. class index
  13. {
  14. public function Show()
  15. {
  16. return "这是one空间中的".__METHOD__."方法";
  17. }
  18. }
  19. }
  20. //第二个命名空间
  21. namespace one2
  22. {
  23. echo (new \one\index)->Show();
  24. }

优先级" class="reference-link">②命名空间->优先级

如果存在同一个类和同一个方法但是命名空间不同,在哪个空间中调用的语句,优先级就是实例这个空间中的方法和类

如果想要访问别的空间,需要用\找到另外空间的成员

代码块

  1. <?php
  2. /**
  3. * namespace 需要写在脚本的顶部,必须是php的第一条指令(除了declare指令)
  4. *
  5. * namespace ns1;
  6. * namespace ns1{
  7. * }
  8. */
  9. //第一个命名空间
  10. namespace one
  11. {
  12. class index
  13. {
  14. public function Show()
  15. {
  16. return "这是one空间中的".__METHOD__."方法";
  17. }
  18. }
  19. //查看类的完全限定名称
  20. echo index::class;
  21. }
  22. //第二个命名空间
  23. namespace one2
  24. {
  25. class index
  26. {
  27. public function Show()
  28. {
  29. return "这是one2空间中的".__METHOD__."方法";
  30. }
  31. }
  32. /*
  33. *如果存在同一个类和同一个方法但是命名空间不同,
  34. *在哪个空间中调用的语句,优先级就是实例这个空间中的方法和类
  35. */
  36. echo ( new index)->Show();
  37. echo "<br>";
  38. echo index::class;
  39. echo "<hr>";
  40. /*
  41. *如果想要访问别的空间,需要用\找到另外空间的成员
  42. */
  43. echo (new \one\index)->Show();
  44. echo "<br>";
  45. }

自定义函数和系统函数优先级" class="reference-link">③命名空间->自定义函数和系统函数优先级

  • 假如在命名空间中,定义一个类方法,这个类方法和系统函数重名,那调用这个函数,会出现什么结果?

在命名空间中如果有一个函数和系统函数重名,我们去调用这个函数的话会优先调用自定义函数,而不是系统函数,因为系统函数是全局函数,要在根空间中查找

在子空间中加入\斜杆来查找根空间中的系统函数,如果子空间未定义这个系统函数,系统会默认调用根空间中的系统函数

代码块

  1. <?php
  2. /**
  3. * namespace 需要写在脚本的顶部,必须是php的第一条指令(除了declare指令)
  4. *
  5. * namespace ns1;
  6. * namespace ns1{
  7. * }
  8. */
  9. namespace one
  10. {
  11. class User{
  12. /*
  13. *假如在命名空间中,定义一个类方法
  14. *这个类方法和系统函数重名,那调用这个函数
  15. *会出现什么结果?
  16. */
  17. //列如定义一个var_dump 和md5
  18. public function var_dump()
  19. {
  20. return "你调用的是我".__METHOD__;
  21. }
  22. public function md5()
  23. {
  24. return "你调用的是我".__METHOD__;
  25. }
  26. }
  27. //调用类中var_dump
  28. echo (new User)->var_dump();
  29. echo "<hr>";
  30. //调用类中md5
  31. echo (new User)->md5();
  32. echo "<hr>";
  33. //调用根空间函数
  34. echo \md5("222");
  35. }

Use在命名空间中的作用" class="reference-link">④命名空间->Use在命名空间中的作用

  • Use在命名空间中的作用
    • 引入别的命名空间到当前空间 为命名空间起别名
    • 引入别的命名空间中的类到当前空间使用, 为别的命名空间中的类起别名
  1. use 导入命名空间

    成功导入命名空间以后 就可以不使用类的完全限定名称调用类元素

  2. use 为导入的空间取别名

    as关键字可以给导入的空间取别名,防止导入的空间名称一样

  3. use 也可以导入空间中的类

    use也可以直接导入空间中想要的类名称

代码块

  1. <?php
  2. /*
  3. * use 在命名空间中的作用
  4. * 1. 引入别的命名空间到当前空间 为命名空间起别名
  5. * 2. 引入别的命名空间中的类到当前空间使用, 为别的命名空间中的类起别名
  6. */
  7. //定义一个命名空间
  8. namespace app\admin\index
  9. {
  10. //输出一个工作类
  11. class demo4
  12. {
  13. public function Show()
  14. {
  15. return "输出当前的空间方法:".__METHOD__;
  16. }
  17. }
  18. }
  19. //用use 把另外一个命名空间引入到这个命名空间
  20. namespace app\admin\connect
  21. {
  22. //1. use 导入命名空间
  23. use app\admin\index;
  24. // 成功导入命名空间以后 就可以不使用类的完全限定名称调用类元素
  25. echo (new index\demo4)->Show(),'<hr>';
  26. //2. use 为导入的空间取别名
  27. use app\admin\index as one ;
  28. echo (new one\demo4)->Show(),'<hr>';
  29. //3. use 也可以导入空间中的类
  30. use app\admin\index\demo4 ;
  31. echo (new demo4)->Show(),'<hr>';
  32. }

二.命名空间类的自动加载

代码块

  1. <?php
  2. /*
  3. *类的自动加载
  4. *spl_autoload_register — 注册给定的函数作为 __autoload 的实现
  5. */
  6. spl_autoload_register(function($className)
  7. {
  8. //先检查当前要加载的类
  9. printf("类名称:%s<br>",$className);
  10. //-----------------------------
  11. /*
  12. *str_replace — 子字符串替换
  13. *用DIRECTORY_SEPARATOR,自动识别当前系统文件分隔符
  14. *解决在不同环境中的文件引用不同
  15. */
  16. $file = str_replace('\\',DIRECTORY_SEPARATOR,$className).".php";
  17. echo $file;
  18. /*
  19. * 判断此文件是否正常和是否为空,如果正常就返回
  20. * is_file — 判断给定文件名是否为一个正常的文件
  21. * file_exists — 检查文件或目录是否存在
  22. */
  23. if( !(is_file($file) && file_exists($file)) )
  24. throw new \Exception('文件名不合法或者文件不存在');
  25. require $file;
  26. });

更多相关文章

  1. NVMe Over Fabrics架构概述
  2. Google为Android平板电脑提供了新的媒体娱乐空间
  3. 苹果Mac图片批量压缩重命名添加水印工具:PhotoBulk
  4. 其他空间类的引用,别名引用,自动加载类,数据库的简单操作
  5. 磁盘空间空间不足的原因及表现与解决办法
  6. C语言动态内存函数的理解和总结
  7. 变量系列教材 (五)- Java的命名规则
  8. 【OCP最新题库解析(052)--题1】Which is true about the SYSTEM an
  9. 【OCP最新题库解析(052)--题46】 Which two are true about tran

随机推荐

  1. Android游戏开发学习(1)--android设置全
  2. Dealing with bitmap object in android
  3. Android 视频播放
  4. Android属性设置大全
  5. android 图片相关处理
  6. android 把TextView中的文字添加阴影效果
  7. Android 全局背景音乐
  8. Error while executing process D:\Andr
  9. android 解决小米手机Android Studio安装
  10. Android基础:什么是Android?