博客列表 >PHP命名空间

PHP命名空间

longlong
longlong原创
2020年07月30日 19:08:44617浏览

1. 命名空间的两种写法

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

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

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>';
  1. <?php
  2. // 1. 当前类的命名空间与当前类的文件路径对应起来
  3. namespace inc\lib;
  4. // 2. 类名必须与当前类文件名称相同
  5. class test1 {
  6. const NAME = '果冻';
  7. public static function show ()
  8. {
  9. return __METHOD__;
  10. }
  11. }

6. 总结

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