PHP学习笔记4——命名空间
命名空间
介绍
- 命名空间是一种封装事务的方法,例如:函数、类、方法等。
- 命名空间作用:用来解决类名或应用程序名冲突问题。举例:项目中会用第三方类,第三方类加载进来后,可能与项目中的类名冲突。
定义要求
- 使用
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();
使用命名空间
- 文件系统中访问文件的方式
- 相对文件名;如果访问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关键字
- 声明空间关键字;
- 可以用来直接代替当前空间名,相当于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();
命名空间在项目中的使用
- 声明命名空间时,要求空间路径与真实的文件夹一致