一、命名空间关键字和常用术语
1、namespace
: 声明一个命名空间。
2、完全限定名称
:总是从根空间开始,第一个字符一定是反斜线。
3、限定名称
:成员名称前面至少要一个命名空间, 至少要有一个反斜线,且不能在首位。
4、非限定名称
:成员前面不能有任何的命名空间,不能有反斜线。
5、导入
:使用use
关键字;别名
:使用as
关键字;。
6、::class
:直接返回的完全限定的类名;__NAMESPACE__
:直接返回的当前空间名称。
对于函数的常量,在当前空间找不到,会自动到全局空间下找。
三类命名空间:
<?php
namespace texhong\nhontrach;
// 声明命名空间必须是程序脚本的第一条语句
class Demo
{
const DEPART = 'texhong_phongnhansu';
}
namespace texhong\nganlong;
class Demo
{
const DEPART = 'nganlong_phongnhansu';
}
namespace texhong;
class Demo
{
const DEPART = 'phongnhansu';
}
// 非限定名称:只能访问当前空间下成员
echo Demo::DEPART .'<br>';
// 限定名称:在具的层级关系的空间下访问深层级的空间成员
echo nganlong\Demo::DEPART .'<br>';
// 完全限定名称:可以访问所有空间下成员
echo \texhong\nhontrach\Demo::DEPART .'<br>';
演示效果图:
别名:
<?php
namespace texhong\nhontrach\xuatnhapkhau\nhanviengiayto;
class Nhanvien
{
const NAME = 'cu';
}
namespace texhong\nhontrach\xuatnhapkhau\nhanviengiayto;
class Chuquan
{
const NAME = 'hien';
}
// 1. 当要多次使用较长空间名称的时候,给空间起个别名会很方便
// 给外部的空间起了一个别名
use texhong\nhontrach\xuatnhapkhau\nhanviengiayto as tnxn;
// 别名调用
echo tnxn\Nhanvien::NAME .'<br>';
echo tnxn\Chuquan::NAME .'<hr>';
// 2. 类级的别名:空间名带上类名称
use texhong\nhontrach\xuatnhapkhau\nhanviengiayto\Nhanvien as NH;
echo NH::NAME .'<hr>';
namespace test;
// 当类别名和原名一样时,可以省略
use texhong\nhontrach\xuatnhapkhau\nhanviengiayto\Nhanvien;
echo Nhanvien::NAME .'<hr>';
演示效果图:
二、自动加载
其实就是通过封装一个函数,实现自动加载
命名空间必须和类文件所在的绝对路径一一对应
当前类名称与当前的类文件的名称完全一致
// 自动加载器
<?php
try {
// 注册自动加载
spl_autoload_register(function($className){
//1. 应该将类名中的命名空间的分隔符转为目录分隔符
$path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
// 2. 生成真正要加载的类文件名称
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
// 3. 加载这个文件
require $file;
});
} catch (Exception $e) {
die($e->getMessage());
}
// 使用自动加载
namespace testAutoload;
require 'autoload.php';
use inc\lib\Demo1;
use inc\lib\Demo2;
use inc\lib\Demo3;
echo Demo1::show() .'<hr>';
echo Demo2::show() .'<hr>';
echo Demo3::show() .'<hr>';
要加载文件目录:
演示效果图:
总结:
1、命名空间借鉴了传统的使用目录管理文件的方式, 来管理程序中的全局成员。
2、完全限定名称、非完全限定名称、非限定名称。(都是名称,也就是名字,相当于文件名。)
3、三者区别在于目录层级的深浅。