博客列表 >PHP 命名空间

PHP 命名空间

Dong.
Dong.原创
2020年09月09日 14:50:57637浏览

1. 命名空间的2中写法 namespace

1.1 方法 1

  1. <?php
  2. // 命名空间:方式一
  3. // 此种声明方式,不能在同脚本中声明匿名空间(全局空间)
  4. namespace ns1;
  5. interface iDemo
  6. {
  7. public function show();
  8. }
  9. class Demo implements iDemo
  10. {
  11. public $name = '果冻';
  12. public function show ()
  13. {
  14. return $this->name;
  15. }
  16. }
  17. $obj = new Demo();
  18. echo $obj->show(),'<hr>';
  19. // 普通写法
  20. // function ff ($obj)
  21. // 如果要声明函数中参数的类型,如下:
  22. // 1. 使用类名 Demo
  23. // function ff (Demo $obj)
  24. // 2. 使用接口名 iDemo,在有接口的的情况下,最好这样使用
  25. function ff (iDemo $obj)
  26. {
  27. echo $obj->show(),'<hr>';
  28. }
  29. ff($obj);
  30. // 在命名空间中访问其他命名空间中的成员
  31. namespace ns2;
  32. // \ : 表示全局空间
  33. $obj1 = new \ns1\Demo();
  34. echo $obj1->show(),'<hr>';
  35. \ns1\ff($obj1);

1.2 方法 2

  1. <?php
  2. // 命名空间:方式二
  3. // 这样的方式就可以在同脚本中声明全局空间(匿名空间)
  4. namespace ns1
  5. {
  6. class Demo
  7. {
  8. public static function show ()
  9. {
  10. return __METHOD__;
  11. }
  12. }
  13. }
  14. namespace ns2
  15. {
  16. // 1. 访问ns1中的show()方法
  17. echo \ns1\Demo::show(),'<hr>';
  18. // 2. 查看当前类全名
  19. echo \ns1\Demo::class,'<hr>';
  20. }
  21. // 全局空间中访问时,可以省略第一个 \
  22. namespace
  23. {
  24. // 1. 访问ns1中的show()方法
  25. echo ns1\Demo::show(),'<hr>';
  26. // 2. 查看当前类全名
  27. echo ns1\Demo::class,'<hr>';
  28. // 因为有了全局空间, 那么全局成员的声明就不应该放在全局,而应该放在空间中
  29. // 因此,全局空间应该主要写对全局对象的调用
  30. }

2. 命名空间的类名引用

  1. <?php
  2. // 命名空间类名的引用
  3. namespace ns1;
  4. class Demo{}
  5. namespace ns2;
  6. class Demo{}
  7. namespace ns3;
  8. // 1. 限定名称:不从根开始但有路径(省略和当前空间名称相当的部分)
  9. echo \ns3\sub\Demo::class,'<hr>';
  10. echo sub\Demo::class,'<hr>';
  11. namespace ns3\sub;
  12. class Demo{}
  13. // 2. 完全限定名称:从根开始且有路径
  14. echo \ns1\Demo::class,'<hr>';
  15. // 3. 非限定名称:没有根也没有路径(当前空间)
  16. echo Demo::class;

3. 命名空间的别名

  1. <?php
  2. // 命名空间的别名
  3. namespace ns1;
  4. class Demo{}
  5. class Test{}
  6. namespace ns2;
  7. class Demo{}
  8. // 1. 空间级别名
  9. echo \ns1\Demo::class,'<hr>';
  10. use \ns1 as n;
  11. echo n\Demo::class,'<hr>';
  12. // 2. 类级别名
  13. use \ns1\Demo as d;
  14. echo d::class,'<hr>';
  15. // 3. 简写:前提是当前空间中不能有同名的类
  16. // use \ns1\Test as Test;
  17. use \ns1\Test;
  18. echo Test::class,'<hr>';
  19. // class Test{} 若有同名的类会报错
  20. // 4. 若在当前空间,可一省略 \
  21. use ns2\Demo as dd;
  22. echo dd::class;

4. 访问类和内置函数的区别

  1. <?php
  2. // 示例一:
  3. namespace ns1
  4. {
  5. function print_r ($arr)
  6. {
  7. return '我在打印 : '.implode(',',$arr);
  8. }
  9. // 1. 访问类时,都要加 \
  10. echo \Arr::NAME,'<hr>';
  11. // 2. 访问函数时
  12. // 2.1 若不加 \ ,访问到当前空间的自定义函数
  13. echo print_r(\Arr::$arr);
  14. echo '<hr>';
  15. // 2.2 若加 \ ,此时到了全局空间中查找,调用了PHP内置函数
  16. \print_r(\Arr::$arr);
  17. echo '<hr>';
  18. }
  19. namespace
  20. {
  21. class Arr{
  22. const NAME = '果冻';
  23. public static $arr = ['aa','bb','cc'];
  24. }
  25. }
  26. // 示例二:
  27. namespace ns2
  28. {
  29. function var_dump($name)
  30. {
  31. echo '我的名字叫 : ' . $name;
  32. }
  33. var_dump(\Arr::NAME);
  34. echo '<hr>';
  35. \var_dump(\Arr::NAME);
  36. }

5. 类的自动加载

  1. <?php
  2. // 类的自动加载
  3. try{
  4. spl_autoload_register(function($class){
  5. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  6. $file = __DIR__.DIRECTORY_SEPARATOR.$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. echo inc\lib\test1::NAME,'<hr>';
  15. echo inc\lib\test1::show(),'<hr>';
  16. echo inc\lib\test2::class,'<hr>';
  17. echo inc\lib\test3::class,'<hr>';
  18. <?php
  19. // 1. 当前类的命名空间与当前类的文件路径对应起来
  20. namespace inc\lib;
  21. // 2. 类名必须与当前类文件名称相同
  22. class test1 {
  23. const NAME = 'peter';
  24. public static function show ()
  25. {
  26. return __METHOD__;
  27. }
  28. }

总结

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

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

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

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

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

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

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

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

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