批改状态:合格
老师批语:可以说, 没有命名空间, 就没有composer, 非常 重要
-命名空间需要在PHP版本5.3以上才可以使用。
-命名空间:它规范了全局成员的声明与访问方式,规范了全局成员的命名方式与命名冲突的解决方案,它借鉴了传统的使·用目录管理文件的方式,来管理程序汇总的全局成员。
-全局成员包括:类,接口,函数,常量。(变量不在此列,变量受到’作用域’的限制)
namespace:创建一个命名空间,必须写在脚本的第一样。(可以理解为新建一个文件夹并给文件夹命名)__NAMESPACE__:魔术常量,返回当前命名空间的名称(可以理解为返回根目录的名称)__CLASS__:返回的是一个‘完全限定名称’的类名__FUNCTION__:返回的是一个‘完全限定名称’的函数名
完全限定名称:可以理解成绝对路径
限定名称:可以理解为相对路径
1.类的调用
例:创建两个PHP文件,demo1.php与demo2.php
demo1命名为ONE
<?php//命名空间必须写在第一行namespace ONE;// 引入demo2require 'demo2.php';// 非限定名称访问,类名称前只要没有'\'都算非限定名称(可以理解为访问当前所在目录下的数据,就是非限定名称访问)// 访问demo文件里,命名空间同为ONE下面的类并赋值$result = Demo::Info();//输出结果echo '<pre>'.print_r($result,true).'</pre>';
demo2
<?php//创建命名空间同为ONEnamespace ONE;class Demo{public static function Info() : array{return [// 查看当前命名空间的名称'name'=>__NAMESPACE__,//查看当前类的绝对路径以及名称'class'=>__CLASS__,//查看当前类调用的方法的绝对路径以及方法名称'method'=>__METHOD__];}}
图
2.接口的调用
例:创建一个demo3.php文件
<?php// 创建一个命名空间,根目录同为ONE,但是有子目录a与a下面的apinamespace ONE\a\api;// 创建一个接口interface iTest{public static function Hello();}
demo1.php
<?php//使用完全限定名称访问// 可以理解为iTest接口在,ONE文件夹下A文件夹下API文件夹里面,引用的demo3文件与当前文件命名空间都在ONE,ONE可以省略class Sub implements \ONE\a\api\iTest{public static function Hello(){// 返回当前类的完全限定类名return self::class;}}$result = Sub::Hello();echo '<pre>'.print_r($result,true).'</pre>';
图
例
3.函数的调用
例:在demo3里面再创建一个函数
<?phpnamespace ONE\a\api;function hello(){return __FUNCTION__;}
demo1
<?php//命名空间必须写在第一行namespace ONE;require 'demo3.php';//调用demo3里面的函数helloecho '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();//路径过长,可以使用use进行导入,把hello函数导入到当前命名空间// 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数use function ONE\a\api\hello;echo '<br>';//非限定名称访问echo '直接访问'.hello();
图
4.常量的调用
例:在demo3里面创建一个常量
<?phpnamespace ONE\a\api;const INFO = 'HELLO WORLD';define('NAME','WORLD');
demo1
<?php//命名空间必须写在第一行namespace ONE;require 'demo3.php';// 使用use导入demo3里面的常量INFO,常量导入的时候必须要使用const,限定导入的内容为常量use const ONE\a\api\INFO;//使用完全限定名称访问echo a\api\INFO;echo '<hr>';//非限定名称访问echo '直接访问:'. INFO;echo '<hr>';//访问define创建的常量,define创建的常量不受命名空间影响echo NAME;
USE使用注意事项:
1.导入类与接口不需要限定词,但是导入函数与常量的时候需要在USE后加入限定词,函数限定词为function,常量限定词为const,define创建的常量不受命名空间影响。
2.经过USE导入后,可以理解为受导入的数据,已经存在于当前命名空间下,可以使用非限定名称访问(直接访问),如果受导入的数据与当前命名空间下的数据有命名冲突,可以使用AS给受导入的数据取一个别名,防止命名冲突。
3.USE并不能代替require和include,在使用USE前还是需要使用require或者include引用PHP文件。
例(把上面demo3的函数hello使用as关键字把名称改为world)
<?php//命名空间必须写在第一行namespace ONE;require 'demo3.php';//调用demo3里面的函数helloecho '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();//路径过长,可以使用use进行导入,把hello函数导入到当前命名空间// 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数use function ONE\a\api\hello as world;echo '<br>';//非限定名称访问echo '直接访问'.world();
图(最终输出的结果是一样的)
::class操作符与常量NAMESPACE的区别
例
<?phpnamespace ONE\a\api;class Demo1{public static function AAA(){return __NAMESPACE__;}}echo '常量NAMESPACE返回值:'.Demo1::AAA();echo '<hr>';echo 'class操作符返回值:'.Demo1::class;
图
个人理解为常量__NAMESPACE__主要用在空间路径的查找上,因为他返回值只会到路径,不会指向最终的数据名字,基于这个原理,可以拼接出只允许某些数据访问的判断语句::class操作符返回的是完整的命名空间路径以及被查询的类名,此返回值可以允许被实例化操作,但是在实例化操作前需要在返回值前加上’\’,因为返回值到根目录,如果一个路劲带上了根目录,就要在最前面加上’\’。
最后,常量__NAMESPACE__作用在命名空间上, ::class操作符,作用在类上。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号