开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:命名空间应用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12726
命名空间应用
内容简介:
一、命名空间的概念
二、应用步骤
三、具体示例
四、代码说明
五、小结
一、概念
1.命名空间应用:
模拟真实的开发环境,运用命名空间的规则
2.命名空间分层
一般是文件夹进行分层(建议使用与文件夹同名空间名) 这样主要是为了方便后期的自动寻找类
3.文件夹的分层
是根据业务的需求和项目开发所选的复杂程度来设计(有的项目只有一个页面就写在一个文件夹里,有的项目有多个功能就写在多个文件夹里,有的项目包含思想层面的架构,文件夹层级更深,更复杂)
二、步骤
1.确定项目开发的复杂程度
2.实现问价分层管理布局
(按照业务不同进行分层,按照设计的层次进行文件夹分层)
3.针对文件分层进性命名空间的使用
(一个文件只属于一个空间),一个文件里面只会定义一个命名空间
三、示例
1.创建文件夹:模拟项目不同文件 PHP 文件放到不同文件夹下,根据下面内容在 web 下面新建文件夹:
--|root ------根目录
--|--|controller ------业务模块
--|--|model ------数据模块
--|--|core -------核心工具
2.业务说明
(1)Root 根目录,存放用户可以直接访问的文件,文件都是请求 controller 里的文件(Root可不用空间)
(2)Controller目录,存放业务逻辑文件,所有业务都是类文件,业务要操作数据库,请求 model里的文件,属于 controller 空间
(3)Model 目录,存放数据库操作的类文件,一张表一个类文件,属于 model 空间
(4)Core 目录,核心工具的存放,属于 core 空间
3.示例步骤
创建3个文件:分别代表 root 目录下(不需要空间),controller 目录下,controller 空间,model 目录下的 model 空间。
首先,在root目录下创建一个文件,参考内容如下:
<?phy
# root 目录下:index.php
# 啥都不用做,直接包含 controller 文件
Include_once ‘controller/user.phy’;
接下来,在 controller 内创建对应的文件夹
然后,新建一个 core目录,命名 DB.Php,参考内容如下:
<?php
#核心文件
# root/core 目录下:DB.php
Namespace core;
Class DB{
Private $link
Public function_contruct(){
#数据库初始化
}
#简单效果:查询全部数据
Public function getALL(¥sql){
Reture’数据查询结果<br>’;
} //这一步是为了实现数据库的操作
模型下面需要做业务,这里就会用到包含空间,model文件。调用 core 下方的 DB,参考内容如下:
<?php
# root/model 目录下:User.php:操作用户数据表
Namespace model;
# 加载DB类
Include_once ‘_D:/server/web/root/core/DB.php’; # 建议使用绝对路径:../和./都会因为嵌套包含而错误
Class User{
Public function getALLUsers(){
#假设数据库链接、数据库、表都已经存在
$sql = “select * from user”;
#调用更高级的操作类实现SQL执行并返回结果:DB属于core 空间,使用完全限定名称访问
$db = new\core\DB();
Return$db->getALL($sql);
}
在 controller 下也包含一个User php 文件,参考内容如下:
<?php
# root/controller 目录下:user.php
Namespace controller;
Class user{
Public function_display(){
#调用模型目录下的 user 类实现数据库的操作:使用完全限定名称访问
Include_once ‘_D:/server/web/root/model/user/php’; # 建议使用绝对路径:../和./都会因为嵌套包含而错误
$u = new\model\user();
$user = $u->getALLUsers();
Var_dump($users);
}
//在操作数据的时候,需要访问model下面的user,通过u->getALL方法(getALLUsers)访问,调用核心DB里的getALL
四、代码说明
1.index.php 在 root 目录下,没有定义空间,内部元素属于全局空间:index.php 包含了子目录 controller 下的 users.php,而 users 类属于 controller空间,所以在 index.php 中访问users 类的使用,可以使用限定名称(全局空间的子空间 controller\空间元素),或者完全限定名称(\子空间\空间元素)
2.Controller/user.php 在 root/controller 文件夹下,定义了空间 controller ,所以文件里面所有的访问,默认都是在 controller 下找。Controller/user 类用到了 model、user 类,所以需要使用完全限定名称访问(同级别不同空间)\model\user
3.Model/user.php 在 root/model 文件夹下,定义了空间 model,所以文件里所有的访问,默认都是在model下找。Model/user 类中用到了 core/DB 类,所以需要使用完全限定名称访问\core\DB
4.Core/db.class.php 在 root/core 文件夹下,定义了空间 core
最后查询运行结果,成功运行,如下图:
//拥有命名空间的参与,就要用到命名空间的访问方式
可以根据文件的目录,来定义它的命名空间
在后续的自动加载中,涉及到的命名空间需要调整,因为系统在访问类的时候,是通过空间进行访问的。
五、小结
1.空间的实际应用是以文件为单位定义空间的
(不绝对,有的应用是不需要以文件为单位。可通过自身的逻辑来定义)
2.空间的划分是按照业务对应的脚本进行划分的
如业务controller,数据model之类
3.文件的包含与空间的包含没有联系
(文件的包含是通过是否可以找到,而空间的包含是指内存里虚拟的内容),二者是独立的:文件是在加载文件是,而空间实在进入内存后(应用同名,会具有相似性)
4.空间的应用
通常是采用非限定名称(自己空间里)和完全限定名称访问(其他空间),实际上建议将完全限定名称转化为非限定名称