PHP中命名空间是怎样的存在?(二)
今天带来的依然是命名空间相关的内容,本身命名空间就是PHP中非常重要的一个特性。所以关于它的各种操作和使用还是非常复杂的,光使用方式就有很多种,我们一个一个的来看。
子命名空间
命名空间本身就像目录一样,所以命名空间当然也是可以定义子命名空间的,真的就和操作系统的各种目录层级是完全一样的。我们通过简单的例子来看看。首先还是创建三个php文件,其中3-2和3-2-1是使用的相同的二级命名空间,3-2-1在FILE32的基础上继续向下扩展了第三级的命名空间FILE321。他们都是MyProject命名空间的子命名空间。
// file3-1.php
namespace MyProject\FILE31;
function testA31(){
echo 'FILE31\testA()', PHP_EOL;
}
// file3-2.php
namespace MyProject\FILE32;
const CONST_A32 = "file3-2";
function testA32(){
echo 'FILE32\testA()', PHP_EOL;
}
class objectA32{
function test(){
echo 'FILE32\ObjectA', PHP_EOL;
}
}
// file3-2-1.php
namespace MyProject\FILE32\FILE321;
function testA321(){
echo 'FILE321\testA()', PHP_EOL;
}
接下来的使用就很简单了,和使用一级命名空间一样,直接使用use进行导入就可以了。
// 子命名空间
require 'namespace/file3-1.php';
require 'namespace/file3-2.php';
require 'namespace/file3-2-1.php';
use MyProject\FILE31;
use MyProject\FILE32;
use MyProject\FILE32\FILE321;
FILE31\testA31(); // FILE31\testA()
FILE32\testA32(); // FILE32\testA()
FILE32\FILE321\testA321(); // FILE321\testA()
FILE321\testA321(); // FILE321\testA()
同一文件中定义多个命名空间
PHP是允许在一个文件中定义多个命名空间的,但是并不推荐这么做,因为这样可能会带来各种未知的混乱。在这里,我们只要了解到可以这样使用就行了,在日常的开发中还是尽量要避免。
// file4.php
namespace FILE41;
function testA41(){
echo 'FILE41\testA()', PHP_EOL;
}
namespace FILE42;
function testA42(){
echo 'FILE42\testA()', PHP_EOL;
}
在使用中当然也和其他命名空间的使用没什么两样,直接use使用即可。
// 一个文件中多个命名空间
require 'namespace/file4.php';
use FILE41, FILE42;
FILE41\testA41(); // FILE41\testA()
FILE42\testA42(); // FILE42\testA()
非限定名称、限定名称、完全限定名称
不要被术语吓到,这三个术语其实非常好理解。
- 非限定名称,名称中不包含命名空间分隔符的标识符,例如 Foo 。
- 限定名称,名称中含有命名空间分隔符的标识符,例如 Foo\Bar 。
- 名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。
直接用例子来说就非常清晰了。
// 非限定名称、限定名称、完全限定名称
use MyProject\FILE32\objectA32 as obj32;
$o = new obj32(); // 非限定名称
$o->test(); // FILE32\ObjectA
$o = new FILE32\objectA32(); // 限定名称
$o->test(); // FILE32\ObjectA
$o = new \MyProject\FILE32\objectA32(); // 完全限定名称
$o->test(); // FILE32\ObjectA
namespace关键字和__NAMESPACE__常量
- namesapce,显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
- NAMESPACE,包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
也是很简单的内容吧,直接来看例子。
// file5.php
namespace FILE5;
function test(){
echo __NAMESPACE__ . ': test()', PHP_EOL;
}
// test.php
namespace Pro;
// namespace与__NAMESPACE__
require 'namespace/file5.php';
function test(){
echo __NAMESPACE__ . ': test()', PHP_EOL;
}
namespace\test(); // Pro: test()
\FILE5\test(); // FILE5: test()
我们给当前命名空间定义为Pro,引入了file5文件。这两个文件中都有一个test()方法,test()方法内都输出了__NAMESPACE__来打印当前的命名空间名称。然后在test.php中,通过namespace关键字调用的就是当前文件的Pro命名空间中的test()方法,输出的是 Pro: test() 。直接使用完全限定名称调用FILE5的test()方法,输出了 FILE5: test() 。
参考文档:
https://www.php.net/manual/zh/language.namespaces.nsconstants.php
https://www.php.net/manual/zh/language.namespaces.rules.php
https://www.php.net/manual/zh/language.namespaces.nested.php
https://www.php.net/manual/zh/language.namespaces.definitionmultiple.php
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
PHP中命名空间是怎样的存在?(二)的更多相关文章
- php中命名空间和use
php中命名空间和use 总结 php中的namespace就有点像java中package包的概念 php中的use的概念就是用别人的命名空间中的类 php中的include enquire是引入文 ...
- TypeScript 中命名空间与模块的理解?区别?
一.模块 TypeScript 与ECMAScript 2015 一样,任何包含顶级 import 或者 export 的文件都被当成一个模块 相反地,如果一个文件不带有顶级的import或者expo ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印
1. 读取 //读取excel指定sheet中的各行数据,存入二维数组,包括首行 public static String[][] getSheetData(XSSFSheet sheet) thro ...
- 在WPF中自定义你的绘制(二)
原文:在WPF中自定义你的绘制(二) 在WPF中自定义你的绘制(二) ...
- Java中使用google.zxing快捷生成二维码(附工具类源码)
移动互联网时代,基于手机端的各种活动扫码和收付款码层出不穷:那我们如何在Java中生成自己想要的二维码呢?下面就来讲讲在Java开发中使用 google.zxing 生成二维码. 一般情况下,Java ...
- WPF中的命令与命令绑定(二)
原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二) 周银辉在WPF中,命令(Commandi ...
- PHP中正则表达式学习及应用(二)
正则表达式中的“元字符” * 匹配前一个内容的0次1次或多次 例如: <?php $mode="/go*gle/"; //前一个内容指的是 * 的前一个字符 o ,在$str ...
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
随机推荐
- Linux统计文本中某个字符串出现的次数
常用的有如下两种方式: 1.VIM 用vim打开文件,然后输入: :%s/hello//gn 如下图: 图中的例子就是统计文本中"hello"字符串出现的次数 说明: %s/pat ...
- NOIP 模拟 $33\; \rm Hunter$
题解 \(by\;zj\varphi\) 结论题. 对于 \(1\) 猎人,他死的期望就是有多少个死在它前面. 那么对于一个猎人,它死在 \(1\) 前的概率就是 \(\frac{w_i}{w_i+w ...
- 腾讯云TDSQL MySQL版 - 开发指南 分布式事务
由于事务操作的数据通常跨多个物理节点,在分布式数据库中,类似方案即称为分布式事务. TDSQL MySQL版 支持普通分布式事务协议和 XA 分布式事务协议.TDSQL MySQL版(内核5.7或以上 ...
- C++ 保存读取二进制
一.保存二进制 #include <iostream> #include <fstream> int main(){ float* output = new float[100 ...
- WebAPI中controller添加[AllowAnonymous]无效的解决方法
对于Methods添加[AllowAnonymous]可以进行匿名访问,但是对于Controller添加时无效 public class AuthAttribute : AuthorizationFi ...
- docker 安装Hive
转自:https://www.cnblogs.com/upupfeng/p/13452385.html#%E9%83%A8%E7%BD%B2hive 使用docker快速搭建hive环境 记录一下 ...
- idea项目在maven projects中显示灰色的解决办法。建新建module src变成标准的文件夹
在使用idea的过程中,有时会遇到其中一个maven模块变成灰色(可以通过view - tool windows -> maven projects 现实),如下所示: 造成这个的原因可能是忽略 ...
- 复习git
git 常用点,详解 from my typora 文章目录 git 常用点,详解 git 模式解析 删除文件 方式一: 方式二: 远程库 配置忽略文件 查看版本库日志,以及版本回退 解决冲突 替换我 ...
- 笔记:如何使用postgresql做顺序扣减库存
如何使用postgresql做顺序扣减库存 Ⅰ.废话在前面 首先这篇笔记源自于最近的一次需求,这个临时性需求是根据两份数据(库存数据以及出库数据) 算出实际库存给到业务,至于库存为什么不等于剩余库存, ...
- linux 查看用户密码
2021-07-26 1.查看前三个密码 head -3 / etc / passwd # 注解 /etc/passwd 中一行记录对应着一个用户,每行记录又被冒号 (:) 分隔为 7 个字段,其格式 ...