女装网站建设文献综述网站建设验收合格确认书
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
<?phpnamespace 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
<?phpnamespace controller; include_once __DIR__ . "/../model/User.php";class User {public function index() {$u = new \model\User();$u->getAllUsers();echo '实现了用户业务操作' . "->";} } - /index.php
<?phpinclude_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;,但是会被当做子空间,使用元素时需要使用限定名称访问(不常使用,不方便)。 
 - 引入一个空间中的多个同种(类、函数、常量)元素,可以使用
 
<?phpnamespace 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;
