Blogger Information
Blog 22
fans 1
comment 1
visits 22257
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础---命名空间全局成员的访问与use导入/别名---PHP培训十期线上班
Miss灬懒虫
Original
1146 people have browsed it

PHP基础—-命名空间全局成员的访问与use导入/别名

学习总结

命名空间的访问类似于系统文件管理的方式,根目录\来表示,我们按照文件管理方式理解就可以了。

其次,特别要注意就是use的导入并不能代替加载includerequire,也就是说在使用use之前,我们依然要加载其所在的脚本文件。

最后,use 默认导入 类、接口、方法,若要导入常量或函数,则需要添加相应的关键字 const|function

当然,我们应该知道,全局成员是包括:类,接口,函数,常量;(不包含变量,因为变量是受到作用域限制,例如函数中的定义的变量,不能在外部访问);

更多说明在代码注释中…..请认真浏览哦 - - -_- !

示例目录

测试效果

app.php代码

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Air15_2019
  5. * Date: 2020/2/10
  6. * Time: 19:35
  7. */
  8. /*
  9. * 命名空间,需要PHP5.3+才能被支持(其参考了传统的目录管理文件的方式);
  10. * 命名空间的功能:
  11. * 1-规范了全局成员的声明与访问方式;
  12. * 2-规范了全局成员的命名方式与命名冲突的解决方案;
  13. * */
  14. /*
  15. * 常用术语
  16. * 全局成员:类,接口,函数,常量;(不包含变量,因为变量是受到作用域限制,例如函数中的定义的变量,不能在外部访问)
  17. * 全局空间:使用‘|’,表示根目录;
  18. * 完全限定名称:是指从根空间检索全局成员,类似于文件管理的绝对路径概念;
  19. * 限定名称:是指从当前空间检索全局成员,类似于文件管理的相对路径;
  20. * 非限定名称:是指仅从当前空间检索全局成员,类似于文件管理的当前路径;
  21. * */
  22. /*
  23. * 关键字
  24. * namespaces,创建命名空间(必须位于代码的第一行),也可用于引用当前命名空间,类似于类中的'self';
  25. * 魔术常量,__NAMESPACE__,__CLASS__,__METHOD__,内部存储的内容类型固定,但数据是变化的,并且由系统自身维护;
  26. * __NAMESPACE__,返回一个包含当前命名空间名称的字符串;
  27. * __CLASS__,返回一个包含当前类“完全限定名称”的字符串;
  28. * __METHOD__,返回一个包含当前方法“完全限定名称”的字符串;
  29. * __FUNCTION__,返回一个包含当前函数“完全限定名称”的字符串;
  30. * ::class,返回具有“完全限定名”的类名;
  31. * */
  32. //创建命名空间
  33. namespace application;
  34. //引用文件 文件
  35. require 'api.php';
  36. require 'interface.php';
  37. require 'config.php';
  38. //root类
  39. class root{
  40. public $rootName;
  41. public function get_root(){
  42. $this->rootName=[
  43. 'namespace'=>__NAMESPACE__,
  44. 'classname'=>__CLASS__,
  45. 'method'=>__METHOD__
  46. ];
  47. return$this->rootName;
  48. }
  49. }
  50. //非限定名称-访问全局成员
  51. echo '非限定名称-访问全局成员<br>';
  52. $root=new root(); //等价于 $root=new namespace\root();
  53. $array_root=$root->get_root();
  54. echo '<pre>'.print_r($array_root).'</pre>';
  55. echo '<hr>';
  56. //限定名称-访问全局成员
  57. echo '限定名称-访问全局成员<br>';
  58. $api=new api\api_lie();
  59. $api_str=$api->results();
  60. echo $api_str;
  61. echo '<hr>';
  62. //完全限定名称-访问全局成员
  63. echo '完全限定名称-访问全局成员**类<br>';
  64. $name=new \application\root();
  65. $array_root=$root->get_root();
  66. echo '<pre>'.print_r($array_root).'</pre>';
  67. echo '<hr>';
  68. //完全限定名称-访问全局成员**常量
  69. echo '完全限定名称-访问全局成员**常量<br>';
  70. echo \application\config\SITE_NAME;
  71. echo '<hr>';
  72. //完全限定名称-访问全局成员**函数
  73. echo '完全限定名称-访问全局成员**函数<br>';
  74. echo \application\config\total(3.3,2);
  75. echo '<hr>';
  76. //完全限定名称-访问全局成员**接口
  77. echo '完全限定名称-访问全局成员**接口<br>';
  78. $inter=new \application\interfaces\registerInfo();
  79. echo $inter->getRegisterID();
  80. echo '<hr>';
  81. //::class 可以解析/反射出类的“完全限定名称”;
  82. $results=root::class;
  83. echo $results;
  84. //===================================================================
  85. /*
  86. * use 关键字的导入机制;
  87. * use 导入,就是声明当前脚本中要使用到的全局成员(使用全局限定名称表示);
  88. * 作用:解决当前脚本中冗长的 完全限定名称;
  89. * 语法:use 全局成员的完全限定名称(因为 use 默认就是从全局开始,所以完全限定名称的`\`可以省略);
  90. * 特别注意:
  91. * 1-导入并不能等于加载,自然也就不能代替`include`|`require`;
  92. * 2-use 默认导入 类、接口、方法,若要导入常量或函数,则需要添加相应的关键字 `const`|`function`;
  93. * */
  94. /*
  95. * 导入的别名,是为了避免出现重名调用的问题;
  96. * 如果不使用 as 赋予别名,那么use 引用的默认别名就是 `完全限定名称的类名 方法名 函数 常量名`;
  97. * */
  98. //use 导入常量
  99. use const application\config\SITE_NAME as Const_site;
  100. //use 导入函数 默认别名 是total
  101. use function application\config\total;
  102. //use 导入类
  103. use application\api\api_lie;
  104. //use 导入接口
  105. use application\interfaces\iRegister;
  106. echo '<br><br>===========use 导入机制==============<br>';
  107. echo '输出常量:<br>';
  108. echo Const_site;
  109. echo '<hr>';
  110. echo '输出函数结果:<br>';
  111. $fun_total=total(8.9,6);
  112. echo $fun_total;
  113. echo '<hr>';
  114. echo '输出引用类的名称:<br>';
  115. $className=api_lie::class;
  116. echo $className;
  117. echo '<hr>';
  118. echo '输出引用接口的名称:<br>';
  119. echo iRegister::class;
  120. echo '<hr>';
  121. ?>

api.php代码

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Air15_2019
  5. * Date: 2020/2/10
  6. * Time: 20:06
  7. */
  8. /*
  9. * api
  10. * */
  11. namespace application\api;
  12. class api_lie{
  13. public static $lie='这是一个静态属性';
  14. public function results(){
  15. return'api_lie_method(results)';
  16. }
  17. }
  18. ?>

interface.php代码

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Air15_2019
  5. * Date: 2020/2/10
  6. * Time: 20:06
  7. */
  8. /*
  9. * 接口类
  10. * */
  11. namespace application\interfaces;
  12. //接口定义
  13. interface iRegister{
  14. public function getRegisterID();
  15. }
  16. //接口实现
  17. class registerInfo implements iRegister{
  18. public $RegisterID=1017;
  19. public function getRegisterID()
  20. {
  21. // TODO: Implement getRegisterID() method.
  22. return '注册ID:'.$this->RegisterID;
  23. }
  24. }
  25. ?>

config.php代码

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Air15_2019
  5. * Date: 2020/2/10
  6. * Time: 20:41
  7. */
  8. /*
  9. * 配置文件config
  10. * */
  11. namespace application\config;
  12. //站点名称
  13. const SITE_NAME='这是一个常量!';
  14. //函数
  15. function total(float $price,int $number):float {
  16. return $price*$number;
  17. }
  18. ?>
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:use 本质上是将完全限定名称成员转为非限定名称,但是在当前空间中默认成员就是非限定命名,所以很可能会命名冲突, 于是就有了别名处理机制. 除了用别名, 还可以用use将完全限定名称转为限定名称也可以避免冲突, 但显然没有别名来得优雅
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
1 comments
Miss灬懒虫 2020-02-11 12:20:41
谢谢 导师的批改评语,受教了!
1 floor
Author's latest blog post