PHP面向对象之命名空间

命名空间

  • 概念
    • 在一个大的项目中,可能会遇到同名的类、函数、常量
    • 为了区分这些元素,我们可以将这些元素分别存放到不同的命名空间中
    • 命名空间就是包,用来存放项目中的类、函数、常量
    • 通过namespace关键字来声明命名空间
<?php
namespace China;
function getInfo(){
	echo '我是中国人<br>';
}
namespace USA;
function getInfo(){
	echo 'I am a America<br>';
}
getInfo();			//I am a America
\USA\getInfo();		//I am a America
\China\getInfo();	//我是中国人
?>

多级命名空间

  • 概念

    • 命名空间的名字可以是多级的(子级命名空间)
  • 如果将相对路径转成绝对路径

公共空间+命名空间+空间元素
公共空间           命名空间                  空间元素
   \         China\Shanghai\PuDong\        Student
<?php
namespace China\Jiangsu\Nanjing;
class Student {
	public function __construct(){
		echo '我是中国人!<br>';
	}
}
namespace USA\Washington;
class Student {
	public function __construct(){
		echo '我是白皮猪!<br>';
	}
}
$stu1= new Student();							//相对路径
$stu2= new \China\Jiangsu\Nanjing\Student();	//绝对路径
$stu3= new \USA\Washington\Student();			//绝对路径
?>

访问空间元素的三种方式

  • 概念
    • 非限定名称访问
    • 完全限定名称访问
    • 限定名称访问
<?php
namespace China\Jiangsu\Nanjing;
function getInfo(){
	echo '南京...<br>';
}
namespace China\Jiangsu;
function getInfo(){
	echo '江苏...<br>';
}
getInfo();							//非限定名称访问	江苏...			
\China\Jiangsu\getInfo();			//完全限定名称访问	江苏...
Nanjing\getInfo();					//限定名称访问		南京...
\China\Jiangsu\Nanjing\getInfo();	//转成绝对路径		南京...
?>

引入命名空间

  • 概念

    • 完全限定名称访问元素路径太长
    • 可以将其他空间引入到当前空间来
    • 通过use引入命名空间
  • 语法

    • 公共空间+引入空间+(去除公共部分,公共部分只能有一级)空间元素
<?php
namespace China\Jiangsu\Nanjing;
function getInfo(){
	echo '兴化...<br>';
}
namespace USA;
function getInfo(){
	echo '江苏...<br>';
}
use China\Jiangsu\Nanjing;
getInfo();			//江苏...			
Nanjing\getInfo();	//兴化...
?>

引入空间元素

  • 概念
    • 引入类:use
    • 引入函数:use function [php7.0以后支持]
    • 引入常量:use const [php7.0以后支持]
<?php
namespace China\Jiangsu\Nanjing;
class Student {
}
function getInfo() {
	echo '韩梅梅<br>';
}
const TYPE='学生';
namespace USA;
use China\Jiangsu\Nanjing\Student;			//引入类
use function China\Jiangsu\Nanjing\getInfo;	//引入函数
use const China\Jiangsu\Nanjing\TYPE;		//引入常量
//测试
$stu= new Student;
var_dump($stu);
echo '<br>';
getInfo();
echo TYPE;
USA\getInfo();	//Call to undefined function USA\USA\getInfo()
?>

给类、函数取别名

  • 概念
    • 如果引入的类和函数与当前空间的类和函数名称相同
    • 需要给引入的类和函数取别名
    • 通过as取别名
<?php
namespace China\Jiangsu\Nanjing;
class Student {
	
}
function getInfo() {
	echo '中国人<br>';
}
namespace USA\Washington;
class Student {
	
}
function getInfo() {
	echo '白皮猪<br>';
}
//引入类取别名
use China\Jiangsu\Nanjing\Student as ChinaStudent;
//引入函数
use function China\Jiangsu\Nanjing\getInfo as info1;
//测试
$stu= new ChinaStudent;
var_dump($stu);
getInfo();	// 白皮猪
info1();	// 中国人
?>

公共空间

  • 概念
    • 如果一个页面没有namespace声明空间
    • 这个页面的元素在公共空间下
    • 公共空间用\表示
<?php
function getInfo() {
	echo '中国人<br>';
}
\getInfo();
?>

命名空间注意事项

  • 概念
    • 命名空间只能存放类、函数、const常量
    • 第一个namespace前面不能有任何的代码
      • 空白字符、header()也不行
    • 包含文件不影响当前的命名空间
posted @ 2020-12-13 10:03  wing1377  阅读(116)  评论(0编辑  收藏  举报