PHP学习笔记4——命名空间

PHP学习笔记4——命名空间

  • 命名空间
    • 介绍
    • 定义要求
    • 语法格式
      • 定义单个命名空间
      • 定义子命名空间
        • 描述
      • 定义多个命名空间
        • 1. 简单组合法
        • 2.大括号语法
          • 匿名空间
    • 使用命名空间
      • 2. 访问命名空间中元素的方式:
  • namespace关键字和魔术常量__NAMESPACE__
    • namespace关键字
    • 魔术常量__NAMESPACE__
  • 命名空间的别名/导入
    • 描述
  • 命名空间在项目中的使用

命名空间

介绍

  • 命名空间是一种封装事务的方法,例如:函数、类、方法等。
  • 命名空间作用:用来解决类名或应用程序名冲突问题。举例:项目中会用第三方类,第三方类加载进来后,可能与项目中的类名冲突。

定义要求

  • 使用namespace关键字来声明一个命名空间;
  • 所有代码都可以存在于命名空间中,但是只有三种代码会受到空间影响:类、常量(const)、函数;
  • 除了类、常量、函数代码外,其他diamante可以写在空间中,但不受空间影响;其他代码相当于“全局代码”。去阿奴代码可以在“任何地方”都能直接使用;
  • 全局代码所在的空间,称为“根空间”,相当于Windows系统的桌面;
  • 声明命名空间的语法,是PHP脚本的第1行代码;空格、空行都不可以;

语法格式

//声明一个命名空间的语法格式
namespace SpaceName;
/*
这里的代码都是空间中的代码;
*/

语法说明:
(1)namespace 是声明空间的关键字,不区分大小写
(2)SpaceName 是定义的空间名称,命名方式与类名相同
(3)所有代码都可以存在与空间中
(4)只有类、函数、常量代码会受到空间影响

定义单个命名空间

代码例子:
namespace.php


//声明一个命名空间
namespace App;

//(1)定义一个学生类
class Student{
     
	private $name="小明";
	public function __construct(){
     
		echo "我的名字叫:{
       $this->name}
"
; } } //(2)定义一个函数 function showInfo(){ echo "PHP命名空间函数"; } //(3)定义一个常量 const DB_HOST="localhost"; //(4)定义一个变量 $a=1000;

app.php


	//声明页面字符集
	header("content-type:text/html;charset=utf-8");
	//(1)包含文件
	require_once("./namespace.php");
	//(2)创建学生类对象
	$obj=new App\Student();
	//(3)调用showInfo()函数
	App\showInfo();
	echo "
"
.App\DB_HOST; echo "
"
.$a;

定义子命名空间

描述

文件夹可以有子目录的情况,命名空间也有子空间情况。

  • 目录的分隔符为斜杠(/),命名空间路径的分隔符是反斜杠()。
    举例:App\Home\Controller

代码例子:
namespace02.php


//声明一个命名空间
namespace App\Home\Controller;

//(1)定义一个学生类
class Student{
     
	private $name="小明";
	public function __construct(){
     
		echo "我的名字叫:{
       $this->name}
"
; } } //(2)定义一个函数 function showInfo(){ echo "PHP命名空间函数"; } //(3)定义一个常量 const DB_HOST="localhost"; //(4)定义一个变量 $a=1000;

app02.php


	//声明页面字符集
	header("content-type:text/html;charset=utf-8");
	//(1)包含文件
	require_once("./namespace02.php");
	//(2)创建学生类对象
	$obj=new App\Home\Controller\Student();
	//(3)调用showInfo()函数
	App\Home\Controller\showInfo();
	echo "
"
.App\Home\Controller\DB_HOST; echo "
"
.$a;

定义多个命名空间

建议:一个文件不要定义多个空间。

1. 简单组合法

代码例子:
namespace03.php


//声明第1个命名空间
namespace App\Home\Controller;
//定义一个学生类
class Student{
     
	private $name="小明";
	public function __construct(){
     
		echo "我的名字叫:{
       $this->name}
"
; } } //声明第2个命名空间 namespace App\Home\Model; //定义一个学生类 class Student{ private $name="小红"; public function __construct(){ echo "我的名字叫:{ $this->name}
"
; } }

app03.php


	//声明页面字符集
	header("content-type:text/html;charset=utf-8");
	//(1)包含文件
	require_once("./namespace03.php");
	//(2)创建学生类对象
	$obj1=new App\Home\Controller\Student();
	$obj2=new App\Home\Model\Student();
	

2.大括号语法

提示:用大括号把空间代码括起来;
-保持一致。要加大括号,所有空间都加大括号;不加大括号,所有空间都不加。


//声明第1个命名空间
namespace App\Home\Controller{
     
	//定义一个学生类
	class Student{
     
		private $name="小明";
		public function __construct(){
     
			echo "我的名字叫:{
       $this->name}
"
; } } } //声明第2个命名空间 namespace App\Home\Model{ //定义一个学生类 class Student{ private $name="小红"; public function __construct(){ echo "我的名字叫:{ $this->name}
"
; } } }
匿名空间

如果一个文件用大括号语法定义多个命名空间,如果要写全局代码,还不想把全局代码加到某个命名空间中,该怎么写?
namespace.php


//声明第1个命名空间
namespace App\Home\Controller{
     
	//定义一个学生类
	class Student{
     
		private $name="小明";
		public function __construct(){
     
			echo "我的名字叫:{
       $this->name}
"
; } } } //声明第2个命名空间 namespace App\Home\Model{ //定义一个学生类 class Student{ private $name="小红"; public function __construct(){ echo "我的名字叫:{ $this->name}
"
; } } } //声明第3个匿名空间(全局代码、根空间代码) namespace { //定义一个教师类 class Teacher{ public function __construct(){ echo "定义一个教师"; } } }

app.php


	//声明页面字符集
	header("content-type:text/html;charset=utf-8");
	//(1)包含文件
	require_once("./namespace.php");
	//(2)创建学生类对象
	$obj1=new App\Home\Controller\Student();
	$obj2=new App\Home\Model\Student();
	$obj3=new Teacher();
	

使用命名空间

  1. 文件系统中访问文件的方式
  • 相对文件名;如果访问a.txt文件,它的完整访问路径是:curDir/a.txt
  • 相对路径名;如果访问a/a.txt文件,它的完整访问路径是:curDir/a/a.txt
  • 绝对路径名;如果访问/a/a.txt文件,它的完整访问路径是:/a/a.txt

2. 访问命名空间中元素的方式:

  • 非限定名称(不含前缀):如果访问$obj=new Student(),它的完整路径是:$obj=new curSpace\Student()
  • 限定名称(含有相对名称):如果访问$obj=new Home\Student(),它的完整路径是:$obj=new curSpace\Home\Student()
    如果访问$obj=new \App\Home\Controller\Student(),它的完整访问路径是:$obj=new \App\Home\Controller\Student()

限定名称-代码例子:


//声明第1个命名空间
namespace App{
     
	//定义一个学生类
	class Student{
     
		private $name="小明";
		public function __construct(){
     
			echo "我的名字叫:{
       $this->name}
"
; } } //创建学生类对象(非限定访问方式) $stuObj=new Student(); //创建教师类对象(限定访问方式) $staObj=new Home\Teacher(); //创建教师类对象(完全限定访问方式) $staObj=new \APP\Home\Teacher(); } //声明第2个命名空间 namespace App\Home{ //定义一个教师类 class Teacher{ private $name="小红"; public function __construct(){ echo "我的名字叫:{ $this->name}
"
; } } }

namespace关键字和魔术常量__NAMESPACE__

namespace关键字

  1. 声明空间关键字;
  2. 可以用来直接代替当前空间名,相当于self关键字。

例子代码:


//声明第1个命名空间
namespace App{
     
	//定义一个学生类
	class Student{
     
		private $name="小明";
		public function __construct(){
     
			echo "我的名字叫:{
       $this->name}
"
; } } //创建学生类对象,namespace就代表APP空间名 $stuObj=new namespace\Student(); //创建教师类对象,namespace就代表APP空间名 $staObj=new namespace\Home\Teacher(); //声明第2个命名空间 namespace App\Home{ //定义一个教师类 class Teacher{ private $name="小红"; public function __construct(){ echo "我的名字叫:{ $this->name}
"
; } } }

魔术常量__NAMESPACE__

描述:获取当前命名空间的字符串名称。

代码例子:


//声明第1个命名空间
namespace App{
     
	//定义一个学生类
	class Student{
     
		private $name="小明";
		public function __construct(){
     
			echo "我的名字叫:{
       $this->name}
"
; } } //构建类名:"App\Student" $className = __NAMESPACE__."\Student"; //创建学生类对象 $stuObj=new $className(); }

命名空间的别名/导入

描述

  • 首先导入空间中的类、常量和函数不能导入。
  • 使用use关键字来导入空间中的类。例如: use App\Home\Controller\Student;
  • 使用use关键字来导入空间名。例如:use App\Home\Controller;
  • 使用as关键字,可以给空间或类起个别名
    • 给空间起别名:use App\Home\Controller as Controller;
    • 给空间中的类起别名:use App\Home\Controller\Student as Student2;

代码例子:
namespace.php


//声明第1个命名空间
namespace App\Home\Controller;
//定义一个学生类
class Student{
     
	private $name="小明";
	public function __construct(){
     
		echo "我的名字叫:{
       $this->name}
"
; } }

app.php


//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)包含文件
require_once("./namespace.php");
//(2)导入空间,默认的空间别名为最后一个单词
use \App\Home\Controller;
$obj=new Controller\Student();
//(3)导入空间并起别名
use \App\Home\Controller as Cont;
$obj=new Cont\Student();
//(4)导入空间中的类,默认的类名为最后一个单词
use \App\Home\Controller\Student;
$obj=new Student();
//(5)导入空间中的类,并起别名
use \App\Home\Controller\Student as Stu;
$obj=new Stu();

命名空间在项目中的使用

  • 声明命名空间时,要求空间路径与真实的文件夹一致

你可能感兴趣的:(PHP,php)