PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 0210命名空间与全局成员导入

0210命名空间与全局成员导入

曾
原创
2020年02月20日 16:10:16 843浏览

命名空间

-命名空间需要在PHP版本5.3以上才可以使用。
-命名空间:它规范了全局成员的声明与访问方式,规范了全局成员的命名方式与命名冲突的解决方案,它借鉴了传统的使·用目录管理文件的方式,来管理程序汇总的全局成员。
-全局成员包括:类,接口,函数,常量。(变量不在此列,变量受到’作用域’的限制)

常用关键字与常量

namespace:创建一个命名空间,必须写在脚本的第一样。(可以理解为新建一个文件夹并给文件夹命名)
__NAMESPACE__:魔术常量,返回当前命名空间的名称(可以理解为返回根目录的名称)
__CLASS__:返回的是一个‘完全限定名称’的类名
__FUNCTION__:返回的是一个‘完全限定名称’的函数名
完全限定名称:可以理解成绝对路径
限定名称:可以理解为相对路径
1.类的调用
例:创建两个PHP文件,demo1.php与demo2.php
demo1命名为ONE

  1. <?php
  2. //命名空间必须写在第一行
  3. namespace ONE;
  4. // 引入demo2
  5. require 'demo2.php';
  6. // 非限定名称访问,类名称前只要没有'\'都算非限定名称(可以理解为访问当前所在目录下的数据,就是非限定名称访问)
  7. // 访问demo文件里,命名空间同为ONE下面的类并赋值
  8. $result = Demo::Info();
  9. //输出结果
  10. echo '<pre>'.print_r($result,true).'</pre>';

demo2

  1. <?php
  2. //创建命名空间同为ONE
  3. namespace ONE;
  4. class Demo
  5. {
  6. public static function Info() : array
  7. {
  8. return [
  9. // 查看当前命名空间的名称
  10. 'name'=>__NAMESPACE__,
  11. //查看当前类的绝对路径以及名称
  12. 'class'=>__CLASS__,
  13. //查看当前类调用的方法的绝对路径以及方法名称
  14. 'method'=>__METHOD__
  15. ];
  16. }
  17. }



2.接口的调用
例:创建一个demo3.php文件

  1. <?php
  2. // 创建一个命名空间,根目录同为ONE,但是有子目录a与a下面的api
  3. namespace ONE\a\api;
  4. // 创建一个接口
  5. interface iTest
  6. {
  7. public static function Hello();
  8. }

demo1.php

  1. <?php
  2. //使用完全限定名称访问
  3. // 可以理解为iTest接口在,ONE文件夹下A文件夹下API文件夹里面,引用的demo3文件与当前文件命名空间都在ONE,ONE可以省略
  4. class Sub implements \ONE\a\api\iTest
  5. {
  6. public static function Hello()
  7. {
  8. // 返回当前类的完全限定类名
  9. return self::class;
  10. }
  11. }
  12. $result = Sub::Hello();
  13. echo '<pre>'.print_r($result,true).'</pre>';




3.函数的调用
例:在demo3里面再创建一个函数

  1. <?php
  2. namespace ONE\a\api;
  3. function hello(){
  4. return __FUNCTION__;
  5. }

demo1

  1. <?php
  2. //命名空间必须写在第一行
  3. namespace ONE;
  4. require 'demo3.php';
  5. //调用demo3里面的函数hello
  6. echo '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();
  7. //路径过长,可以使用use进行导入,把hello函数导入到当前命名空间
  8. // 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数
  9. use function ONE\a\api\hello;
  10. echo '<br>';
  11. //非限定名称访问
  12. echo '直接访问'.hello();



4.常量的调用
例:在demo3里面创建一个常量

  1. <?php
  2. namespace ONE\a\api;
  3. const INFO = 'HELLO WORLD';
  4. define('NAME','WORLD');

demo1

  1. <?php
  2. //命名空间必须写在第一行
  3. namespace ONE;
  4. require 'demo3.php';
  5. // 使用use导入demo3里面的常量INFO,常量导入的时候必须要使用const,限定导入的内容为常量
  6. use const ONE\a\api\INFO;
  7. //使用完全限定名称访问
  8. echo a\api\INFO;
  9. echo '<hr>';
  10. //非限定名称访问
  11. echo '直接访问:'. INFO;
  12. echo '<hr>';
  13. //访问define创建的常量,define创建的常量不受命名空间影响
  14. echo NAME;

USE使用注意事项:
1.导入类与接口不需要限定词,但是导入函数与常量的时候需要在USE后加入限定词,函数限定词为function,常量限定词为const,define创建的常量不受命名空间影响。
2.经过USE导入后,可以理解为受导入的数据,已经存在于当前命名空间下,可以使用非限定名称访问(直接访问),如果受导入的数据与当前命名空间下的数据有命名冲突,可以使用AS给受导入的数据取一个别名,防止命名冲突。
3.USE并不能代替requireinclude,在使用USE前还是需要使用require或者include引用PHP文件。

例(把上面demo3的函数hello使用as关键字把名称改为world)

  1. <?php
  2. //命名空间必须写在第一行
  3. namespace ONE;
  4. require 'demo3.php';
  5. //调用demo3里面的函数hello
  6. echo '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();
  7. //路径过长,可以使用use进行导入,把hello函数导入到当前命名空间
  8. // 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数
  9. use function ONE\a\api\hello as world;
  10. echo '<br>';
  11. //非限定名称访问
  12. echo '直接访问'.world();

图(最终输出的结果是一样的)

::class操作符与常量NAMESPACE的区别

  1. <?php
  2. namespace ONE\a\api;
  3. class Demo1
  4. {
  5. public static function AAA()
  6. {
  7. return __NAMESPACE__;
  8. }
  9. }
  10. echo '常量NAMESPACE返回值:'.Demo1::AAA();
  11. echo '<hr>';
  12. echo 'class操作符返回值:'.Demo1::class;



个人理解为常量__NAMESPACE__主要用在空间路径的查找上,因为他返回值只会到路径,不会指向最终的数据名字,基于这个原理,可以拼接出只允许某些数据访问的判断语句
::class操作符返回的是完整的命名空间路径以及被查询的类名,此返回值可以允许被实例化操作,但是在实例化操作前需要在返回值前加上’\’,因为返回值到根目录,如果一个路劲带上了根目录,就要在最前面加上’\’。
最后,常量__NAMESPACE__作用在命名空间上, ::class操作符,作用在类上。

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