PHP命令空间namespace及use的用法
使用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的用法的更多相关文章
- PHP命令空间namespace及use的用法实践总结
以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...
- C++ 名字空间namespace的使用
A namespace is a scope.C++ provides namespaces to prevent name conflicts.A namespace is a mechanism ...
- C++命令空间使用和编译
先创建目录结构 src bin obj lib include 1.创建命名空间 创建一个头文件include/head.h; #ifndef _GOOD_H #define _GOOD_H name ...
- C#设置有命令空间的属性
之前被问到一个问题,C#中如何设置android:name这样的属性?我的第一反应是直接setAttribute不就可以了么 SetAttribute(name, value), 可事实上却不行,因为 ...
- 3-18 关于namespace,双冒号::的用法; SelfYield.
关于namespace,双冒号::的用法. 防止引用多个模块在一个文件/类中,有重名的对象.::可以调用类的类方法,和常量. class Foo BAR = "hello" ...
- python命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
- namespace及use的用法
namespace(以下简称ns).在定义了一个ns之后,下面所申明的class.interface.const(不包含variable)都是在申明的ns这个“域”里面的.当引用一个申明了ns的包含文 ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- 借个例子说明sed的模式空间,以及针对模式空间的N,P,D用法
下面是我们要处理的文本:题目要求是把所有散列在不同行的同一个中括号中的数据集中在一起, 见下表就秒懂了吧 处理前的文本 处理后的文本 [123456][ASDEF][ABCD123WF][789ADC ...
随机推荐
- ITester软件测试小栈,快来点击领取你的能量值!
日供一卒,功不唐捐,这不是一个非正常更新的ITester软件测试小栈,不定期分享软件测试相关,包括功能.接口.自动化.性能.专项.测试开发,简历指点,面试助攻,群而不党,和而不同,如趋同,且同行.
- 欧拉路&&欧拉回路
T1是欧拉路板子,但我不会,直接爆炸.. 这玩意就是个dfs,但我以前一直以为欧拉路只能$O(nm)$求 今天才知道可以$O(n+m)$ 欧拉路判定: 无向:起点终点为奇度点,其余偶度 有向:起点终点 ...
- 从V神到以太坊——以太坊发展简史
以太坊的出现,让人们的认识从比特币飞跃到了区块链本身.使得区块链技术在非金融领域的普遍应用成为可能,同时,也被认为是区块链2.0时代的标志,是区块链技术发展史上重要的里程碑. 以太坊的故事,要从比特币 ...
- 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法
未正常关闭minicom yesaidu@ywf-ubuntu: ~$ ls /var/lock LCK..ttyS0 subsys yesaidu@ywf-ubuntu: ~$ kill 0 ye ...
- starUML 3.0.2文件 百度云
文件百度云---链接:https://pan.baidu.com/s/1BVX9Ze40bkgd3k_4WFb99A 提取码:t7kj 使用方法:将starUML安装目录(一般为 C:\Program ...
- linux引导之grub2
先了解下什么是Bootloader 以下是百度百科释意 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适 ...
- X-Admin&ABP框架开发-RBAC
在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然, ...
- 03-MyBatis拦截器机制
目录 MyBatis拦截器介绍 拦截器的使用 拦截器介绍及配置 源码分析 总结 本文转载自MyBatis拦截器原理探究 MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽 ...
- [RAM] FPGA的学习笔记——RAM
1.RAM——随机存取存储器, 分为SRAM和DRAM. SRAM:存和取得速度快,操作简单.然而,成本高,很难做到很大.FPGA的片内存储器,就是一种SRAM,用来存放程序,以及程序执行过程中,产生 ...
- [LC]747题 Largest Number At Least Twice of Others (至少是其他数字两倍的最大数)
①中文题目 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums ...