使用namespace的目的

命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的'封装'的概念。

团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突;

据个人理解,用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所有新建的model类,所以为了避免你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该通过沟通避免,即使事发后也应该重新调整类名即时维护,避免后期造成因为对类的理解混淆而带来维护上的复杂度提高)

namespace的使用方法

1、namespace后命名的定义不区分大小写;一个PHP文件客房多个命名空间,第一个命名空间前不能有代码;namespace建议用类名

2、没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠\,也可以不加。

//1.php
class Person{
function __construct(){
echo 'I am one!';
}
}
//name.php
require_once './1.php'; new Person(); //输出 I am one!;
new \Person(); //输出 I am one!;

3、 new类时,当前定义了命名空间时,类名一定用反斜杠字符。

myday.php
<?php
class myday
{
function mda(){
echo "今天是星期五";
}
}
Anlis.php
<?php
namespace one;
require('myday.php');
$day = new \myday();

这是因为当前已经定义了命名空间,如果new时类名不加“\”,它会默认加上one命名空间,会报以下错误:

Fatal error: Class 'one\myday' not found in C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\Anlis.php on line 5

4、 根命名空间和子命名空间

命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。当前命名下调用别的命名空间的类时,使用了一种像文件路径的语法: \空间名\元素名(类名)。

当然,也可以使article和message board这两个模块其实都是处于同一个blog项目内。如果用命名空间来表达它们的关系,是这样:

<?php
//我用这样的命名空间表示处于blog下的article模块
namespace Blog\Article; class Comment { } //我用这样的命名空间表示处于blog下的messageBoard模块
namespace Blog\MessageBoard; class Comment { } //调用当前空间的类
$comment = new Comment(); //调用Blog\Article空间的类
$article_comment = new \Blog\Article\Comment();
?>

而且,子空间还可以定义很多层次,比如说 Blog\Article\Archives\Date

使用use的目的

在命名空间字符串过长时,使用use可以相应的缩短命名空间。

use的使用方法

1、new类时,最前面无需用反斜杠。此外,use后没有as时,别名默认为最后一个反斜杠后的内容

<?php
namespace animal\dog;
class Life{
function __construct(){
echo 'dog life!<br>';
}
} namespace animal\cat;
class Life{
function __construct(){
echo 'cat life!<br>';
}
}

//没有使用use
new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间;输出:cat life!
new \animal\dog\Life(); //输出:dog life! //使用use
use animal\dog;
new dog\Life(); //输出:dog life!
use animal\dog as d; //定义别名:d
new d\Life(); //输出:dog life!

使用use和没有使用use区别

(1)、使用了use在当前命名空间下调用别的命名空间的元素,不加“\”也不会默认加上当前命名空间。

(2)、没使用use时,不加“\”也会默认加上当前命名空间。

2、namespace后面不建议加类名,但use可以。

namespace animal\dog;
class Life{
function __construct(){
echo 'dog life!';
}
} namespace animal\cat;
class Life{
function __construct(){
echo 'cat life!';
}
} use animal\dog\Life as dog;
new dog();//输出:dog life!

如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

注:如果上面不用as dog就会报错。因为命名空间cat下也有个一样名称的Life类,可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类,所以use后加上类名必须加上as才不会报错。

总结:

1、namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。

2、use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。

参考链接:https://www.cnblogs.com/drunkhero/p/namespace.html

PHP命令空间namespace及use的用法的更多相关文章

  1. PHP命令空间namespace及use的用法实践总结

    以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...

  2. C++ 名字空间namespace的使用

    A namespace is a scope.C++ provides namespaces to prevent name conflicts.A namespace is a mechanism ...

  3. C++命令空间使用和编译

    先创建目录结构 src bin obj lib include 1.创建命名空间 创建一个头文件include/head.h; #ifndef _GOOD_H #define _GOOD_H name ...

  4. C#设置有命令空间的属性

    之前被问到一个问题,C#中如何设置android:name这样的属性?我的第一反应是直接setAttribute不就可以了么 SetAttribute(name, value), 可事实上却不行,因为 ...

  5. 3-18 关于namespace,双冒号::的用法; SelfYield.

    关于namespace,双冒号::的用法. 防止引用多个模块在一个文件/类中,有重名的对象.::可以调用类的类方法,和常量. class Foo   BAR = "hello"   ...

  6. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  7. namespace及use的用法

    namespace(以下简称ns).在定义了一个ns之后,下面所申明的class.interface.const(不包含variable)都是在申明的ns这个“域”里面的.当引用一个申明了ns的包含文 ...

  8. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

  9. 借个例子说明sed的模式空间,以及针对模式空间的N,P,D用法

    下面是我们要处理的文本:题目要求是把所有散列在不同行的同一个中括号中的数据集中在一起, 见下表就秒懂了吧 处理前的文本 处理后的文本 [123456][ASDEF][ABCD123WF][789ADC ...

随机推荐

  1. Ubuntu18.04 安装MySQL(Linux)解决登陆权限问题及Navicat for mysql 中文乱码问题

    一.MySQL(Linux)解决登陆权限问题 Ubuntu18.04 安装mysql或者mariadb之后,发现普通用户和远程都没有权限连接. ERROR 1045: Access denied fo ...

  2. C++ 11新标准实现POJ No.1001-Exponentiation

    Exponentiation(高精度幂计算)(标签:链表,字符串,快速幂计算) 题目描述 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要你解 ...

  3. Java操作数栈

    - 与局部变量表一样,均以字长为单位的数组.不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问.操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区.- 存储的数据与局部变量表一致含in ...

  4. MATLAB基本使用及SIMULINK建模仿真实验

    MATLAB基本使用及SIMULINK建模仿真实验 这是我总结的操作方法: 1 )  M脚本文件的编写 1.新建M-file: 2.输入指令: 3.保存(注意:保存路径需要与工作路径一致) 2 )在S ...

  5. day6-作业(不完整)

    # 1.用代码实现:利用下划线将列表的'每一个元素'拼接成字符串 li=['ndfj','dlfj',12434]# 注意是将元素与元素转换为字符串之间用_拼接,而不是将每个字符串进行拼接 li=[' ...

  6. Python 基础 常用模块

    Python 为我们提供了很多功能强大的模块,今天就主要使用的到的模块进行整理,方便后面来翻阅学习. 一.时间模块 在时间模块中我们重点介绍几种自己常用的功能,主要方便我们按照自己想要的方式获取时间 ...

  7. 使用CBrother的CLIB库调用windows的API

    使用CBrother的CLIB库调用windows的API 2.1.0版本CBrother加入了CLib库,最新需要写一个工具,根据路径查杀一个Windows进程,研究了一下,CLib库的用法,感觉还 ...

  8. NW.js打包一个桌面应用

    1.安装nw(可以到官网:https://nwjs.io下载) npm install nw -g 2.创建一个最最简单的nw应用 在nwjs文件夹中 新建index.html和package.jso ...

  9. php如何在mysql里批量插入数据

    假如说我有这样一个表,我想往这个表里面插入大量数据 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREM ...

  10. nyoj 17-单调递增最长子序列 && poj 2533(动态规划,演算法)

    17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:49 题目描述: 求一个字符串的最长递增子序列的长度 如 ...