命名空间
- 概念
- 在一个大的项目中,可能会遇到同名的类、函数、常量
- 为了区分这些元素,我们可以将这些元素分别存放到不同的命名空间中
- 命名空间就是包,用来存放项目中的类、函数、常量
- 通过
namespace
关键字来声明命名空间
<?php
namespace China;
function getInfo(){
echo '我是中国人<br>';
}
namespace USA;
function getInfo(){
echo 'I am a America<br>';
}
getInfo(); //I am a America
USAgetInfo(); //I am a America
ChinagetInfo(); //我是中国人
?>
多级命名空间
-
概念
- 命名空间的名字可以是多级的(子级命名空间)
-
如果将相对路径转成绝对路径
公共空间+命名空间+空间元素
公共空间 命名空间 空间元素
ChinaShanghaiPuDong Student
<?php
namespace ChinaJiangsuNanjing;
class Student {
public function __construct(){
echo '我是中国人!<br>';
}
}
namespace USAWashington;
class Student {
public function __construct(){
echo '我是白皮猪!<br>';
}
}
$stu1= new Student(); //相对路径
$stu2= new ChinaJiangsuNanjingStudent(); //绝对路径
$stu3= new USAWashingtonStudent(); //绝对路径
?>
访问空间元素的三种方式
- 概念
- 非限定名称访问
- 完全限定名称访问
- 限定名称访问
<?php
namespace ChinaJiangsuNanjing;
function getInfo(){
echo '南京...<br>';
}
namespace ChinaJiangsu;
function getInfo(){
echo '江苏...<br>';
}
getInfo(); //非限定名称访问 江苏...
ChinaJiangsugetInfo(); //完全限定名称访问 江苏...
NanjinggetInfo(); //限定名称访问 南京...
ChinaJiangsuNanjinggetInfo(); //转成绝对路径 南京...
?>
引入命名空间
-
概念
- 完全限定名称访问元素路径太长
- 可以将其他空间引入到当前空间来
- 通过use引入命名空间
-
语法
公共空间+引入空间+(去除公共部分,公共部分只能有一级)空间元素
<?php
namespace ChinaJiangsuNanjing;
function getInfo(){
echo '兴化...<br>';
}
namespace USA;
function getInfo(){
echo '江苏...<br>';
}
use ChinaJiangsuNanjing;
getInfo(); //江苏...
NanjinggetInfo(); //兴化...
?>
引入空间元素
- 概念
- 引入类:use
- 引入函数:use function [php7.0以后支持]
- 引入常量:use const [php7.0以后支持]
<?php
namespace ChinaJiangsuNanjing;
class Student {
}
function getInfo() {
echo '韩梅梅<br>';
}
const TYPE='学生';
namespace USA;
use ChinaJiangsuNanjingStudent; //引入类
use function ChinaJiangsuNanjinggetInfo; //引入函数
use const ChinaJiangsuNanjingTYPE; //引入常量
//测试
$stu= new Student;
var_dump($stu);
echo '<br>';
getInfo();
echo TYPE;
USAgetInfo(); //Call to undefined function USAUSAgetInfo()
?>
给类、函数取别名
- 概念
- 如果引入的类和函数与当前空间的类和函数名称相同
- 需要给引入的类和函数取别名
- 通过as取别名
<?php
namespace ChinaJiangsuNanjing;
class Student {
}
function getInfo() {
echo '中国人<br>';
}
namespace USAWashington;
class Student {
}
function getInfo() {
echo '白皮猪<br>';
}
//引入类取别名
use ChinaJiangsuNanjingStudent as ChinaStudent;
//引入函数
use function ChinaJiangsuNanjinggetInfo as info1;
//测试
$stu= new ChinaStudent;
var_dump($stu);
getInfo(); // 白皮猪
info1(); // 中国人
?>
公共空间
- 概念
- 如果一个页面没有
namespace
声明空间 - 这个页面的元素在公共空间下
- 公共空间用
表示
- 如果一个页面没有
<?php
function getInfo() {
echo '中国人<br>';
}
getInfo();
?>
命名空间注意事项
- 概念
- 命名空间只能存放类、函数、const常量
- 第一个namespace前面不能有任何的代码
- 空白字符、header()也不行
- 包含文件不影响当前的命名空间