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

本文详细介绍了PHP中的命名空间,包括其作用、定义要求、语法格式,如如何定义单个和子命名空间,以及如何使用命名空间。通过示例代码解释了如何在项目中有效地组织和访问命名空间内的类、常量和函数,同时也提到了namespace关键字和魔术常量__NAMESPACE__的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名空间

介绍

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

定义要求

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

语法格式

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

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

定义单个命名空间

代码例子:
namespace.php

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

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

app.php

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

定义子命名空间

描述

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

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

代码例子:
namespace02.php

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

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

app02.php

<?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 "<br>".App\Home\Controller\DB_HOST;
	echo "<br>".$a;
	

定义多个命名空间

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

1. 简单组合法

代码例子:
namespace03.php

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

app03.php

<?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.大括号语法

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

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

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

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

app.php

<?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()

限定名称-代码例子:

<?php
//声明第1个命名空间
namespace App{
	//定义一个学生类
	class Student{
		private $name="小明";
		public function __construct(){
			echo "我的名字叫:{$this->name}<br>";
		}
	}
	//创建学生类对象(非限定访问方式)
	$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}<br>";
		}
	}
}

namespace关键字和魔术常量__NAMESPACE__

namespace关键字

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

例子代码:

<?php
//声明第1个命名空间
namespace App{
	//定义一个学生类
	class Student{
		private $name="小明";
		public function __construct(){
			echo "我的名字叫:{$this->name}<br>";
		}
	}
	//创建学生类对象,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}<br>";
		}
	}
}

魔术常量__NAMESPACE__

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

代码例子:

<?php
//声明第1个命名空间
namespace App{
	//定义一个学生类
	class Student{
		private $name="小明";
		public function __construct(){
			echo "我的名字叫:{$this->name}<br>";
		}
	}
	//构建类名:"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

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

app.php

<?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();

命名空间在项目中的使用

  • 声明命名空间时,要求空间路径与真实的文件夹一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值