博客列表 >PHP 命名空间关键技术------PHP培训十期线上班 学号:510251 02月10日作业

PHP 命名空间关键技术------PHP培训十期线上班 学号:510251 02月10日作业

赵大叔
赵大叔原创
2020年02月29日 11:05:35667浏览

命名空间关键技术

一、关键字和常用术语

1、完全限定名称:从全局空间开始查找的成员,类似绝对路径。

2、限定名称:从当前空间开始查找的成员,类似相对路径。

3、非限定名称:仅在当前空间查找的成员,类似当前路径。

4、use:导入关键字。用法:use ...

5、::class:返回具的完全限定的类名。

Q&A:
Q1: 完成限定名称与限定名称, 非限定名称之间的转换方式是什么?
A1:
1、 非限定名称和限定名称可以直接转化成完全限定名称,区别在于开始查找的位置。
2、 完全限定名称:\开始。
3、非完全限定名称:至少有一个且不是第一个字符的\
4、非限定名称:没有\

Q2: use 解决了什么问题?
A2: 先用use关键字直接导入成员,可以避免写冗长的完全限制名称。

as 解决导入简化完全限定名称时造成命名冲突的问题

Q3: ::class操作符为什么比__NAMESPACE__好用? 具体应用场景有哪些?
A3: ::class:直接返回的完全限定的类名;__NAMESPACE__:直接返回的当前空间名称。
1、我们一般都直接调用类,所以::class用的更多。
2、__NAMESPACE__.\Demo\function:此用法可以避免代码被写死的问题。

二、实例演示

1、完全限定名称访问四类全局成员的方式

  1. //demo2 创建带有命名空间的全局成员
  2. <?php
  3. //创建带命名空间的类
  4. namespace unit1\loai;
  5. class Loai
  6. {
  7. public static function index() : array
  8. {
  9. return [
  10. 'className' => __CLASS__
  11. ];
  12. }
  13. }
  14. //创建带命名空间的接口
  15. namespace unit1\api;
  16. interface iTest
  17. {
  18. public static function xinchao ();
  19. }
  20. //创建带命名空间的函数
  21. namespace unit1\flx;
  22. function getFuncname () : string
  23. {
  24. return __FUNCTION__;
  25. }
  26. //创建带命名空间的常量
  27. namespace unit1\param;
  28. const SITE_NAME = 'TEXHONG';
  1. //demo1 完全限定名称访问四类全局成员
  2. <?php
  3. //创建命名空间
  4. namespace unit1;
  5. // 1、访问完全限定名称的类
  6. //加载
  7. require 'demo2.php';
  8. //完全限定名称,从全局开始“\”
  9. $result1 = \unit1\loai\Loai::index();
  10. //返回具有完全限定名称的类名
  11. echo '<pre>' .print_r($result1,true);
  12. echo '<hr>';
  13. // 2、访问完全限定名称的接口
  14. //接口需要先实现接口中的方法
  15. class Test implements \unit1\api\iTest
  16. {
  17. public static function xinchao()
  18. {
  19. return class_implements(self::class);
  20. }
  21. }
  22. $result2 = Test::xinchao();
  23. echo '<pre>' .print_r($result2,true);
  24. echo '<hr>';
  25. // 3、访问完全限定名称的函数
  26. $result3 = \unit1\flx\getFuncname();
  27. echo '<pre>' .print_r($result3,true);
  28. echo '<hr>';
  29. // 4、访问完全限定名称的常量
  30. $result4 = \unit1\param\SITE_NAME;
  31. echo '<pre>' .print_r($result4,true);
  32. echo '<hr>';

2、导入四类全局成员的方式

  1. <?php
  2. //导入’use‘
  3. namespace unit1;
  4. //加载
  5. require 'demo2.php';
  6. //导入类
  7. use unit1\loai\Loai;
  8. $result1 = loai::index();
  9. echo '<pre>' .print_r($result1,true);
  10. echo '<hr>';
  11. //导入接口
  12. use unit1\api\iTest;
  13. //接口需要先实现接口中的方法
  14. class Test implements iTest
  15. {
  16. public static function xinchao()
  17. {
  18. return class_implements(self::class);
  19. }
  20. }
  21. $result2 = Test::xinchao();
  22. echo '<pre>' .print_r($result2,true);
  23. echo '<hr>';
  24. //导入函数(和类、接口的区别, 要加上类型)
  25. use function unit1\flx\getFuncname;
  26. $result3 = getFuncname ();
  27. echo '<pre>' .print_r($result3,true);
  28. echo '<hr>';
  29. //导入常量
  30. use const unit1\param\SITE_NAME;
  31. $result4 = SITE_NAME;
  32. echo '<pre>' .print_r($result4,true);
  33. echo '<hr>';

3、全局成员中的别名引用方式

别名:解决导入简化的完全限定名称的成员的同时, 也会带来命名的冲突问题。

  1. function getFuncname () : string
  2. {
  3. //.....
  4. }
  5. //导入函数(和类、接口的区别, 要加上类型)
  6. //如果当前空间已经有函数,则导入会报错,’as‘ 别名可以解决
  7. //别名和原名一样,则可以省略
  8. use function unit1\flx\getFuncname as getFuncnamex;
  9. $result3 = getFuncnamex ();
  10. echo '<pre>' .print_r($result3,true);
  11. echo '<hr>';

有关命名空间的总结:
1、命名空间借鉴了传统的使用目录管理文件的方式, 来管理程序中的全局成员。
2、完全限定名称、非完全限定名称、非限定名称。(都是名称,也就是名字,相当于文件名。)
3、三者区别在于目录层级的深浅。

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