Blogger Information
Blog 30
fans 0
comment 1
visits 24078
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0210命名空间与全局成员导入
Original
880 people have browsed it

命名空间

-命名空间需要在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操作符,作用在类上。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:可以说, 没有命名空间, 就没有composer, 非常 重要
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
0 comments
Author's latest blog post