今天带来的依然是命名空间相关的内容,本身命名空间就是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://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%BA%8C%EF%BC%89%20.php

参考文档:

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中命名空间是怎样的存在?(二)的更多相关文章

  1. php中命名空间和use

    php中命名空间和use 总结 php中的namespace就有点像java中package包的概念 php中的use的概念就是用别人的命名空间中的类 php中的include enquire是引入文 ...

  2. TypeScript 中命名空间与模块的理解?区别?

    一.模块 TypeScript 与ECMAScript 2015 一样,任何包含顶级 import 或者 export 的文件都被当成一个模块 相反地,如果一个文件不带有顶级的import或者expo ...

  3. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  4. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  5. Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印

    1. 读取 //读取excel指定sheet中的各行数据,存入二维数组,包括首行 public static String[][] getSheetData(XSSFSheet sheet) thro ...

  6. 在WPF中自定义你的绘制(二)

    原文:在WPF中自定义你的绘制(二)   在WPF中自定义你的绘制(二)                                                                 ...

  7. Java中使用google.zxing快捷生成二维码(附工具类源码)

    移动互联网时代,基于手机端的各种活动扫码和收付款码层出不穷:那我们如何在Java中生成自己想要的二维码呢?下面就来讲讲在Java开发中使用 google.zxing 生成二维码. 一般情况下,Java ...

  8. WPF中的命令与命令绑定(二)

    原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二)                                              周银辉在WPF中,命令(Commandi ...

  9. PHP中正则表达式学习及应用(二)

    正则表达式中的“元字符” * 匹配前一个内容的0次1次或多次 例如: <?php $mode="/go*gle/"; //前一个内容指的是 * 的前一个字符 o ,在$str ...

  10. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

随机推荐

  1. VulnHub靶场渗透之:Gigachad

    环境搭建 VulnHub是一个丰富的实战靶场集合,里面有许多有趣的实战靶机. 本次靶机介绍: http://www.vulnhub.com/entry/gigachad-1,657/ 下载靶机ova文 ...

  2. SQL 练习41

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水.如果不存在第二高的薪水,那么查询应返回 ...

  3. noip12

    T1 类似于昨天的t3,先用单调栈求出管控区间,然后暴力求解30pts 我没取模还没开longlong,然后就爆0了 正解: 仍然是用单调栈求一下区间,用线段树维护一下余数,对于i所对应的区间\([l ...

  4. Docker运行中文版GitLab

    docker-compose.yml version: '3' services: web: image: 'twang2218/gitlab-ce-zh:10.5' restart: always ...

  5. Anaconda Pycharm 是怎么个事儿?

    前言 许多人学习Python的经历可能很相似,写程序没有问题,最后却被各种环境困扰. 不论你是Python小白,还是学习Python有一段时间了.都可以认真的看一下ヾ(≧▽≦*)o 这篇文章让你对An ...

  6. C# 高级进阶(一)

    产品是怎样开发出来的 首先了解--产品MVP(Minimum Viable Product)的概念 最小可行产品--意思即开发最初应该是根据参品预期,最快构建出一个符合预期可行的功能合集,后期再通过用 ...

  7. 超详细教程2021新版oracle官网下载Windows JAVA-jdk11并安装配置(其他版本流程相同)

    异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复:本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告.本人所有文章发布平台为CSDN.博客园.简书和开源中国,后期可能会有个人博客,除此之外 ...

  8. Layui form表单提交注意事项

    // 表单提交form.on('submit(first1)', function (data) { var articleFrom = data.field; $.ajax({ type:" ...

  9. SpringBoot笔记(4)

    一.请求处理 1.1 常用参数注解使用 注解 使用 @PathVariable 获取URI模板指定请求,并赋值到变量中,不指定可以将所有请求放到map中,但是健值都为String @RequestHe ...

  10. linux centos7 获取开机时间

    2021-08-03 1. who 命令 who 命令显示关于当前在本地系统上的所有用户信息:登录名,线路,时间,备注 # 列出当前登录本系统的用户 who # 列出本系统的开机/重启时间 who - ...