博客列表 >服务端 - PHP - OOP之命名空间和类的自动加载

服务端 - PHP - OOP之命名空间和类的自动加载

郴
原创
2020年05月12日 11:07:12627浏览

服务端 - PHP - OOP之命名空间和类的自动加载

一、命名空间

  • 基本语法:namespace 空间名称;
  • 保留全局空间的语法:namespace 空间名称 {//代码}
  • 规则:命名空间的路径与类库文件的目录一致
  • 访问:use 命名空间名称 as 别名

1. 完全限定名称

  • 解释:总是从根空间开始,第一个字符一定是反斜线,根空间, 理解成绝对路径
  1. //定义第一个命名空间
  2. namespace test\A;
  3. class PersonInfo {
  4. public static $name = '小明';
  5. }
  6. //定义第二个命名空间
  7. namespace test\B;
  8. class PersonInfo {
  9. public static $name = '小红';
  10. }
  11. //使用完全限定名称访问另一个空间的成员
  12. echo \test\A\PersonInfo::$name;

2. 限定名称

  • 解释:成员名称前面至少要一个命名空间, 至少要有一个反斜线\, 且不能在首位, 理解成:相对路径
  1. //定义第一个命名空间
  2. namespace test\A;
  3. class PersonInfo {
  4. public static $name = '小明';
  5. }
  6. //使用限定名称访问另一个空间的成员
  7. echo B\PersonInfo::$name;
  8. //定义第二个命名空间
  9. namespace test\A\B;
  10. class PersonInfo {
  11. public static $name = '小红';
  12. }

3. 非限定名称

  • 解释:成员前面不能有任何的命名空间,不能有”\”, 理解成文件当前路径
  1. //定义命名空间
  2. namespace test\B;
  3. class PersonInfo {
  4. public static $name = '小红';
  5. }
  6. //使用非限定名称访问当前命名空间
  7. echo PersonInfo::$name;

4. 别名使用

  1. //定义第一个命名空间
  2. namespace test\A;
  3. class PersonInfo {
  4. public static $name = '小明';
  5. }
  6. //定义第二个命名空间
  7. namespace test\B;
  8. class PersonInfo {
  9. public static $name = '小红';
  10. }
  11. //定义第三个命名空间
  12. namespace test\C;
  13. use test\A as A; //空间级的别名
  14. use test\B as B; //空间级的别名
  15. echo A\PersonInfo::$name;
  16. echo B\PersonInfo::$name;
  17. echo '<br>';
  18. use test\A\PersonInfo as P1; //类级的别名
  19. use test\B\PersonInfo as P2; //类级的别名
  20. echo P1::$name;
  21. echo P2::$name;

二、类的自动加载

  • 条件:1. 命名空间必须和类文件所在的绝对路径一一对应; 2. 当前类名称与当前的类文件的名称完全一致
  • 步骤:
    1. 使用 spl_autoload_register() 注册自动加载器
    1. 函数体:将类名中的命名空间的分隔符转为目录分隔符
    1. 函数体:生成真正要加载的类文件名称
    1. 函数体:加载这个文件
    1. 封装自动加载器
    1. 导入需要加载的类的路径

1. autoload.php(自动加载类)

  1. try {
  2. spl_autoload_register(function($className) {
  3. //1. 将类名中的命名空间的分隔符转为目录分隔符
  4. $path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
  5. //2. 生成真正要加载的类文件名称
  6. $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  7. //3. 加载这个文件
  8. require $file;
  9. });
  10. } catch (Exception $e) {
  11. die($e->getMessage());
  12. }

2. 需要自动加载的类

  1. namespace pub\putong;
  2. class PersonInfo {
  3. public static function getName() {
  4. return '小明';
  5. }
  6. }

3. 入口文件

  1. //封装自动加载器
  2. require 'autoload.php';
  3. use pub\putong\PersonInfo;
  4. echo PersonInfo::getName();

三、课程总结

  • 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了命名空间和自动加载类的特点和使用场景以及它们的基本用法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议