序言

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,使用ThinkPHP框架可以极大简化我们的开发过程,节省时间。这个专题我将记录自己学习使用ThinkPHP5.0的进行实战开发的过程,学习资料。这篇文章首先介绍一个ThinkPHP中十分重要的概念:命名空间

命名空间

由于PHP语法里不支持函数重载机制,如果一个应用里有两个同名的方法,怎么办?在Yii框架为了避免名字重复引起问题,全部的类前边都有 C 字样,而在ThinkPHP里就引入了命名空间这个概念。其中有几点需要特别注意:

a) 命名空间是虚拟的定义空间,不是真实存在目录

b) 命名空间的分隔符都是反斜杠 \

c) 命名空间只对函数,类,常量(const定义的常量,非define定义的常量)有效。

d) 命名空间有三种访问方式:非限定名称访问方式;限定名称访问方式;完全限定名称访问方式。

接下来就一一详细说明。

 一、命名空间只对函数,类,常量(const定义的常量,非define定义的常量)有效。

这里我们声明了两个命名空间space1和space2,两个命名空间下面有同名的函数getmsg(),同名的常量a,同名的类Animal,因为它们处于不同的命名空间下,所以不会产生错误。我们在浏览器中打开,得到如下输出:helloworld。

如果我们尝试用define定义两个同名常量呢?

浏览器中打开报如下错误:

所以命名空间只对函数,类,常量(const定义的常量,非define定义的常量)有效。

二、多级命名空间和三种访问方式

上面声明的命名空间space1和space2都是单级命名空间,形如 space1\space2\space3的命名空间为多级命名空间,分隔符为\。下面介绍三种命名空间访问方式:

1、非限定名称访问方式

当以非限定名称访问方式访问时,访问的是当前命名空间下的函数(类和常量同理),所以以上代码输出结果是:world。

2、完全限定名称访问方式

如果想要在 name2\space2 命名空间下访问 name1\space1下的getmsg()方法,可以使用完全限定名称访问方式(相当于绝对路径访问)。

所以上述代码的输出结果为:hello。

3、限定名称访问方式

限定名称访问方式与完全限定名称访问方式差别只在最前面的\。如果上例使用限定名称访问方式访问,则将最后一行改为:name1\space1\getmsg();

此时,我们在浏览器中打开,发现如下错误:

提示我们无法找到命名空间 name2\space2\name1\space1 下的 getmsg() 函数。原因是限定名称访问方式相当于相对路径访问,我们在当前命名空间下使用限定名称访问方式访问:name1\space1\getmsg(),会在当前命名空间下寻找name1\space1下的getmsg()函数,找不到就会报错。所以,如果我们再声明一个名为: name2\space2\name1\space1 的命名空间,上述访问就可以正常执行,如下:

输出结果为:hello-world。

三、命名空间和空间类元素的引入机制

1、引入命名空间

通过上面的例子,我们可以看到如果想要在当前命名空间下使用另一个命名空间下的函数、常量或者类元素的时候,我们需要使用完全限定访问方式进行访问,写代码比较繁琐,所以,我们可以引入命名空间,然后使用限定名称访问方式进行访问,简化访问过程。

输出结果为:hello

dog

2、引入空间类元素

与命名空间的引入方式类似,使用 use 关键字引入空间类元素,然后直接使用非限定访问方式进行访问即可。不过,在当前命名空间下不能存在与引入类同名的类,否则会产生错误。

输出结果为:dog大黄。

四、公共空间

如果我们没有使用 namespace 关键字声明命名空间,则其属于公共空间。

这里我们建立两个php文件,1.php 和 2.php,1.php命名空间为 name1\space1, 2.php为公共空间。

1.php:

 namespace  name1\space1;
header("content-type:text/html;charset=utf-8");
class Animal
{
public $obj = 'dog';
static $name = '大黄';
}
function getmsg()
{
echo 'hello';
} const MN = 123; //在命名空间中引入公共命名空间 include ('./2.php'); getmsg(); //访问的是当前空间下的getmsg()函数
echo '</br>';
\getmsg(); //访问的是公共命名空间(即2.php文件)下的getmsg()函数 echo '</br>';
echo MN; //会先在当前命名空间下寻找MN常量,如果找到就输出,如果找不到,就会去公共命名空间寻找MN常量
echo '</br>';
echo \MN; //访问的是公共命名空间(即2.php文件)下的MN常量

2.php:

 //没有指定命名空间,则其属于公共命名空间
function getmsg()
{
echo 'world';
} const MN = '456';

浏览器中打开1.php,输出结果为:

hello
world
123
456

五、 命名空间是虚拟的定义空间,不是真实存在目录

在thinkphp5.0中,命名空间是虚拟的定义空间,不是真实存在目录。只不过是官方在声明命名空间时,命名空间的名称刻意与目录结构有对应关系。

例如,我们打开 application/index/controller 文件夹下的 Index.php 文件,其命名空间为:app\index\controller。在目录结构中并不存在。

以上就是关于thinkphp中关于命名空间的全部内容,了解清楚之后就可以进行实战开发了。

Thinkphp5.0实战开发一------命名空间详解的更多相关文章

  1. Thinkphp5.0实战开发二------自动生成目录结构

    序言 ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build 类库.ThinkPHP5.0中模块文件夹在application ...

  2. 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar

    原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...

  3. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  4. SpringMVC【开发Controller】详解

    前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方法接收参数 字符串转日期 重定向和转发 返回JSON ...

  5. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  6. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  7. Spark2.1.0——内置RPC框架详解

    Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...

  8. loadrunner 脚本开发- web_url函数详解

    脚本开发- web_url函数详解 by:授客 QQ:1033553122   加载指定url的web页面(GET请求) C语言函数 int web_url( const char *StepName ...

  9. Linq实战 之 DataSet操作详解

    Linq实战 之 DataSet操作详解  一:linq to Ado.Net 1. linq为什么要扩展ado.net,原因在于给既有代码增加福利.FCL中在ado.net上扩展了一些方法. 简单一 ...

随机推荐

  1. Arduino开发版学习计划--蓝牙控制小车行走

    蓝牙模块一共6个引脚,我们一般只需要接4个线就可以了,分别是VCC.GND.TXD.RXD这四个引脚,我们分别接到arduino板子上,VCC接3.3V,GND接板子的GND,蓝牙TXD接板子的RXD ...

  2. JAVA NIO使用非阻塞模式实现高并发服务器

    参考:http://blog.csdn.net/zmx729618/article/details/51860699  https://zhuanlan.zhihu.com/p/23488863 ht ...

  3. java web页面跳转 总结

    Servlet中forward和redirect的区别 forward方式:request.getRequestDispatcher("/somePage.jsp").forwar ...

  4. uitextFiled字数输入限制

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...

  5. java基础07 循环结构

    public class While02 { public static void main(String[] args) { /** * while(循环条件){ * 循环体(循环操作) * } * ...

  6. abap 开发之创建表维护生成器

    在sap开发中有时需要对一些自建表维护数据,但又不想写程序,怎么办呢??这个时候我们可以直接生成个表维护生成器,为其定义一个事物码就ok了.以下是表格维护生成器的生成步骤. 首先我们需要先定义表.输入 ...

  7. PAT 1108 Finding Average [难]

    1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...

  8. 1141 PAT Ranking of Institutions[难]

    1141 PAT Ranking of Institutions (25 分) After each PAT, the PAT Center will announce the ranking of ...

  9. Xcode插件开发案例教程

    引言 在平时开发过程中我们使用了很多的Xcode插件,虽然官方对于插件制作没有提供任何支持,但是加载三方的插件,默认还是被允许的.第三方的插件,存放在 ~/Library/Application Su ...

  10. mysql数据库从删库到跑路之mysq索引

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...