-命名空间需要在PHP版本5.3以上才可以使用。
-命名空间:它规范了全局成员的声明与访问方式,规范了全局成员的命名方式与命名冲突的解决方案,它借鉴了传统的使·用目录管理文件的方式,来管理程序汇总的全局成员。
-全局成员包括:类,接口,函数,常量。(变量不在此列,变量受到’作用域’的限制)
namespace
:创建一个命名空间,必须写在脚本的第一样。(可以理解为新建一个文件夹并给文件夹命名)__NAMESPACE__
:魔术常量,返回当前命名空间的名称(可以理解为返回根目录的名称)__CLASS__
:返回的是一个‘完全限定名称’的类名__FUNCTION__
:返回的是一个‘完全限定名称’的函数名
完全限定名称:可以理解成绝对路径
限定名称:可以理解为相对路径
1.类的调用
例:创建两个PHP文件,demo1.php与demo2.php
demo1命名为ONE
<?php
//命名空间必须写在第一行
namespace ONE;
// 引入demo2
require 'demo2.php';
// 非限定名称访问,类名称前只要没有'\'都算非限定名称(可以理解为访问当前所在目录下的数据,就是非限定名称访问)
// 访问demo文件里,命名空间同为ONE下面的类并赋值
$result = Demo::Info();
//输出结果
echo '<pre>'.print_r($result,true).'</pre>';
demo2
<?php
//创建命名空间同为ONE
namespace ONE;
class Demo
{
public static function Info() : array
{
return [
// 查看当前命名空间的名称
'name'=>__NAMESPACE__,
//查看当前类的绝对路径以及名称
'class'=>__CLASS__,
//查看当前类调用的方法的绝对路径以及方法名称
'method'=>__METHOD__
];
}
}
图
2.接口的调用
例:创建一个demo3.php文件
<?php
// 创建一个命名空间,根目录同为ONE,但是有子目录a与a下面的api
namespace 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里面再创建一个函数
<?php
namespace ONE\a\api;
function hello(){
return __FUNCTION__;
}
demo1
<?php
//命名空间必须写在第一行
namespace ONE;
require 'demo3.php';
//调用demo3里面的函数hello
echo '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();
//路径过长,可以使用use进行导入,把hello函数导入到当前命名空间
// 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数
use function ONE\a\api\hello;
echo '<br>';
//非限定名称访问
echo '直接访问'.hello();
图
4.常量的调用
例:在demo3里面创建一个常量
<?php
namespace 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里面的函数hello
echo '返回的是当前函数的绝对路径以及函数的名称'.a\api\hello();
//路径过长,可以使用use进行导入,把hello函数导入到当前命名空间
// 注意导入函数的时候要使用function进行限定,表示当前导入的数据为函数
use function ONE\a\api\hello as world;
echo '<br>';
//非限定名称访问
echo '直接访问'.world();
图(最终输出的结果是一样的)
::class操作符与常量NAMESPACE的区别
例
<?php
namespace 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
操作符,作用在类上。