PHP面向对象03:命名空间
- 一、命名空间基础
- 二、子空间
- 三、命名空间访问
- 1. 非限定名称
- 2. 限定名称
- 3. 完全限定名称
- 四、全局空间
- 五、命名空间应用
- 六、命名空间引入
一、命名空间基础
namespace
,是指人为的将内存进行分隔,让不同内存区域的同名结构共存。- 基本语法:
namespace 空间名字;
- 作用:能够创建同名结构,包括函数、常量、类。
- 注意事项:
- 命名空间的声明必须在所有代码之前。
- 一个文件中只定义一个空间。
二、子空间
- 命名空间子空间通过
namespace
+路径符号\
实现
<?php
# 创建一级空间
namespace my_space;
# 创建子空间
namespace my_space\space1;
- 也可以直接创建子空间
三、命名空间访问
1. 非限定名称
- 直接访问空间元素的名字,此类访问的时当前代码所属空间内的元素。
- 非限定名称访问就好比是访问当前自己文件夹下的所有文件。
<?php
namespace my_space;
function show(){
echo __METHOD__;
}
# 非限定访问
show();
2. 限定名称
- 在访问元素的前面使用相应的空间名字,限定名称访问时基于子空间来实现的。
- 使用自己当前的子空间名字 +
\
+ 元素名称 - 限定名称访问就好比是访问当前自己文件夹下的子文件夹内容。
<?php
namespace my_space\space1;
function show(){
echo __NAMESPACE__;
}
namespace my_space;
function show(){
echo __NAMESPACE__;
}
# 限定名称访问
space1\show();
3. 完全限定名称
- 从根目录(全局空间)开始访问,使用
\
作为全局空间开始符号。 - 完全限定名称访问就好比从磁盘根目录访问对应路径下的内容。
<?php
namespace my_space\space1;
function show(){
echo __NAMESPACE__;
}
namespace my_space;
function show(){
echo __NAMESPACE__;
}
# 完全限定名称访问
\my_space\space1\show();
四、全局空间
- 即空间元素在没有定义空间的情况下所属的空间,也是所有定义的空间的顶级空间。
- 全局空间没有名字。
- 所有的空间本质上都是在全局空间下划分的。
- 全局空间元素的访问:使用完全限定名称访问。
- 一旦命名空间出现,那么空间元素的访问就被限定在空间内。如果使用非限定名称访问,那么系统会以下解析逻辑:
- 首先一定在自己空间内查找
- 如果找不到元素,不同空间元素的处理不同
- 系统常量、系统函数如果找不到,会自动去全局空间找
- 系统类不会自动取全局空间找,而是直接报错
- 如果一个文件有空间,包含了一个没有空间的文件,那么要访问文件中的内容,需要使用全局空间
\
。
五、命名空间应用
-
创建文件夹:
- root:根目录,存放用户可以直接访问的文件,比如入口,访问controller里的文件。
- controller:存放业务逻辑文件,所有业务都是类文件,业务需要操作数据库,请求model里的文件。
- model:存放数据库操作的类文件,一张表一个类文件。
- core:存放核心工具。
-
编写代码
- /core/DB.php
<?php namespace core; class DB{ public function __construct() { echo "数据库初始化" . "->"; } public function query() { echo "数据查询" . "->"; } }
- /model/User.php
<?php namespace model; use core\DB; include_once __DIR__ . "/../core/DB.php"; class User { public function getAllUsers() { $sql = "select * from User"; $db = new \core\DB(); $db->query($sql); echo "查询所有用户数据" . "->"; } }
- /controller/User.php
<?php namespace controller; include_once __DIR__ . "/../model/User.php"; class User { public function index() { $u = new \model\User(); $u->getAllUsers(); echo '实现了用户业务操作' . "->"; } }
- /index.php
<?php include_once "controller/User.php"; $u = new \controller\User(); $u->index();
- /core/DB.php
六、命名空间引入
- 命名空间引入,就是将另外一个空间的元素(类、函数和常量)引入到当前空间来,当作当前空间的元素访问,从而可以减少复杂的完全限定名称访问,取而代之的是非限定名称访问。
- use进行空间包含时,默认是从全局空间开始构建空间路径。
- 空间引入的元素默认是类,如果要引入其他元素,就必须使用响应关键字:
function
和const
- 如果引入空间元素与本空间元素重名,使用
as
关键字。 - 引入的多种情况
- 引入一个空间中的多个同种(类、函数、常量)元素,可以使用
,
分隔。 - 引入一个空间中的不同种元素,使用
use space\{Human, function show as my_show, const P};
- 引入一个空间中的所有元素,直接引入空间
use space;
,但是会被当做子空间,使用元素时需要使用限定名称访问(不常使用,不方便)。
- 引入一个空间中的多个同种(类、函数、常量)元素,可以使用
<?php
namespace space1;
class Man {
public function __construct() {
echo __METHOD__;
}
}
function show() {
echo __METHOD__;
}
const P = 3;
namespace space2;
// 引入空间元素
use space1\Man;
// 引入函数
use function space1\show as my_show;
// 引入常量
use const space1\P;
$man = new Man();
my_show();
echo P;