目录启示:使用 use 关键字为命名空间内的元素建立非限定名称
文章目录
- 参考
- 环境
- 三种名称
- 非限定名称
- 限定名称
- 完全限定名称
- 举个栗子
- use
- use 关键字
- use ... as ..
- 命名冲突
- 真假美猴王
- 两个世界
参考
| 项目 | 描述 |
|---|---|
| 搜索引擎 | Bing、Google |
| AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
| PHP 官方 | PHP Manual |
| PHP 官方 | language.namespaces.rationale.php |
环境
| 项目 | 描述 |
|---|---|
| PHP | 5.5.0、5.6.8、7.0.0、7.2.5、7.4.9、8.0.0、8.2.9 |
| PHP 编辑器 | PhpStorm 2023.1.1(专业版) |
三种名称
在 PHP 命名空间的上下文中,限定名称 (Qualified Name)、非限定名称 (Unqualified Name) 与完全限定名称 (Fully Qualified Name) 是 三种引用命名空间中的元素(类、接口、函数 与 常量)的方式。
非限定名称
非限定名称是一个 不包含任何命名空间前缀的名称,如 ClassName 就是一个非限定名称。当使用非限定名称时,PHP 会 优先在当前命名空间中查找该元素。若该原始不存在于当前命名空间中,则将在全局命名空间中对其进行查找(仅当被查找元素为函数或常量时)。
限定名称
限定名称包含 命名空间前缀,但没有开头的反斜线 \(该反斜线表示全局命名空间)。如 NamespaceName\ClassName 与 NamespaceName\functionName() 就是限定名称。当使用限定名称时,PHP 会 基于当前命名空间来解析该名称。
完全限定名称
完全限定名称从反斜线 \(该反斜线表示全局命名空间) 开始,后接命名空间或元素的名称。如 \Full\NamespaceName\ClassName 与 \Full\NamespaceName\functionName() 就是完全限定名称。当使用完全限定名称时,PHP 会 完全忽略当前命名空间的上下文,并从全局上下文解析名称。
举个栗子
<?phpnamespace HOME\RedHeart {function saySelf() {# 通过魔术常量 __NAMESPACE 回当前所属的命名空间名称return __NAMESPACE__;}function saySon() {# 尝试访问当前命名空间中的子命名空间 BinaryMoon 中的 saySelf() 函数return BinaryMoon\saySelf();}
}namespace HOME\RedHeart\BinaryMoon {function saySelf() {return __NAMESPACE__;}
}# 全局命名空间
namespace {# 尝试访问 HOME\RedHeart\BinaryMoon 命名空间下的 saySelf() 函数var_dump(\HOME\RedHeart\BinaryMoon\saySelf());# 尝试访问 HOME\RedHeart 命名空间下的 saySelf() 函数var_dump(HOME\RedHeart\saySelf());# 尝试访问 HOME\RedHeart 命名空间下的 saySon() 函数var_dump(\HOME\RedHeart\saySon());
}
执行效果
string(24) "HOME\RedHeart\BinaryMoon"
string(13) "HOME\RedHeart"
string(24) "HOME\RedHeart\BinaryMoon"
use
use 关键字
在 PHP 中,use 关键字用于导入命名空间中的 类、接口、函数 或 常量,以便在当前命名空间中直接使用这些元素的 非限定名称,有助于提高开发体验😎。对此,请参考如下示例:
<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {# 将 \HOME\RedHeart\BinaryMoon\ 命名空间下的# MyClass 类导入至当前命名空间,便可以使用非限定名称访问该类。use \HOME\RedHeart\BinaryMoon\MyClass;var_dump(new MyClass());# 将 \HOME\RedHeart\BinaryMoon\ 命名空间下的# 函数 sayHello 与常量 CONSTANT 导入当前命名空间use function HOME\RedHeart\BinaryMoon\sayHello;use const HOME\RedHeart\BinaryMoon\CONSTANT;sayHello();print(CONSTANT . "\n");
}
执行效果
在 PHP 中,use 关键字的默认操作对象是 类。若您需要将 函数 或 常量 导入至当前命名空间,请在 use 关键字后添加 function 或 const 以告知 PHP 解释器。
object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon
use … as …
在 PHP 中,use ... as ... 语句用于导入命名空间中的 类、接口、函数 或 常量并为它们创建一个 别名,以便可以在当前代码块中使用别名来引用相关的元素。对此,请参考如下示例:
<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {use \HOME\RedHeart\BinaryMoon\MyClass as AnClass;use function HOME\RedHeart\BinaryMoon\sayHello as speakHello;use const HOME\RedHeart\BinaryMoon\CONSTANT as ANCONSTANT;var_dump(new AnClass());speakHello();print(ANCONSTANT . "\n");
}
执行效果
object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon
命名冲突
真假美猴王
<?phpnamespace BinaryMoon {class BinaryMoon {}
}
在上述示例中,命名空间 BinaryMoon 与其 类元素 BinaryMoon 使用相同名称。按照正常情况,两者将发生 命名冲突,但上述示例却能够正常执行。这是由于,命名空间 BinaryMoon 的完全限定名称是 \BinaryMoon,而 类元素 BinaryMoon 的完全限定名称是 \BinaryMoon\BinaryMoon,两者的名称 并不真的相同。

两个世界
实际上,命名空间与其他元素之间并不会产生命名冲突,即使两者的完全限定名称一模一样。对此,请参考如下示例:
<?phpnamespace BinaryMoon {}namespace {class BinaryMoon {}var_dump(new \BinaryMoon());
}
执行效果
在使用 class 关键字创建类 BinaryMoon 后,类与命名空间具有相同的完全限定名称 \BinaryMoon,这并不会导致两者发生 命名冲突,PHP 会 依据具体情景进行分析来确定如何解析该名称。但程序并非完美的,它无法应对所有可能的场景,鉴于此,请 尽可能不要尝试使用相同的名称。
object(BinaryMoon)#1 (0) {
}

相关文章:
目录启示:使用 use 关键字为命名空间内的元素建立非限定名称
文章目录 参考环境三种名称非限定名称限定名称完全限定名称举个栗子 useuse 关键字use ... as .. 命名冲突真假美猴王两个世界 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 官方PHP ManualPHP 官方language.namespaces.ra…...
Go语言介绍与安装
介绍与安装 本教程介绍了 Go,并讨论了选择 Go 相对于其他编程语言的优势。我们还将学习如何在Windows 中安装 Go。 介绍 Go也称为Golang,是由 Google 开发的一种开源、编译型、静态类型的编程语言。 Go创造背后的关键人物是Rob Pike、 Ken Thompson和…...
常用傅里叶变换表
傅里叶展开 傅里叶变换 傅里叶逆变换 时域信号 弧频域信号 线性变换 时域平移 频域平移 伸缩变换 微分性质 逆变换的微分性质 卷积定理 原函数变换结果 单位阶跃函数: 符号函数: 矩形函数: 辛格函数:...
生活中的视音频技术
生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话,一般都会如下图所示,一大堆五花八门的电影。(其实专业的影视爱好者一概会把影视文件分门别类的,但我比较懒,一股脑把电影放在了一起) 因为下载…...
一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide
中文名:脱硫生物素-碘乙酰胺 英文名:Desthiobiotin-Iodoacetamide 化学式:C14H25IN4O3 分子量:424.28 外观:固体/粉末 规格:10mg、25mg、50mg等(接受各种规格的定制服务,具体可…...
【(数据结构) —— 顺序表的应用-通讯录的实现】
(数据结构)—— 顺序表的应用-通讯录的实现 一.通讯录的功能介绍1.基于动态顺序表实现通讯录(1). 功能要求(2).重要思考 二. 通讯录的代码实现1.通讯录的底层结构(顺序表)(1)思路展示(2)底层代码实现(顺序表) 2.通讯录上层代码实现(通讯录结构…...
macbook磁盘清理免费教程分享
笔记本电脑在是我们工作和生活中重要组成部分,磁盘清理是常有的事,而macbook作为其中的代表之一,也越来越受到人们的青睐。然而,如何进行macbook磁盘清理,也事许多人都会遇到的问题,特别是被提示“磁盘已满…...
cartographer_ros数据加载与处理
node_main.cc 坐标系的读取通过tf_bufferautonode类是cartographer_ros接收传感器数据,并传输到cartographer里,同时还会发布map,轨迹等node_options数据传给两个地方,一个是map_builder进行slam操作,一个是node做数据…...
设计模式-7种结构型模式
适配器模式: 将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同调用。 桥接模式: 将类的抽象部分和他的实现部分分离开来。是他们可以独立的变化。 它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两…...
华为李鹏:加速5G商业正循环,拥抱更繁荣的5.5G(5G-A)
2023年10月10日,在华为主办的第十四届全球移动宽带论坛上,华为高级副总裁、运营商BG总裁李鹏面向来自全球的运营商和产业伙伴,提出抓住网络需求和趋势的力量——“面向后天的业务,积极规划明天的网络,加速5G商业正循环…...
Marin说PCB之CoilcraftBourns POC 电感的性能对比
十一小长假本来是一件美好事情。可是天有不测风云,小编我却有祸兮来了。本来是公司的硬件同事强哥要回以色列了,最近他们国家那边都在打仗,强哥本着舍身为国的精神回国抗战去了。小编我就想着在他回国之前搞了篮球比赛送别一下他呢࿰…...
聊聊Maven的依赖传递、依赖管理、依赖作用域
1. 依赖传递 在Maven中,依赖是会传递的,假如在业务项目中引入了spring-boot-starter-web依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>…...
centos6/7 SOCKS5 堆溢出漏洞修复(RPM方式)curl 8.4 CVE-2023-38545 CVE-2023-38546
引用 https://darkdark.top/update-curl.html centos6 rpm 升级包下载:https://download.csdn.net/download/sinat_24092079/88425840 yum update libcurl-8.4.0-1.el6.1.x86_64.rpm curl-8.4.0-1.el6.1.x86_64.rpmcentos7 rpm 升级包下载:https://down…...
C#,数值计算——数据建模Proposal的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Proposal { public Normaldev gau { get; set; } null; private double logstep { get; set; } public Proposal(int ranseed, double lstep) { this.gau…...
如何使用命令生成动态链接库.dll文件(保姆级教学)
如何使用命令生成动态链接库.dll文件 /*** file 如何使用命令生成动态链接库.dll文件* author jUicE_g2R(qq:3406291309)* * brief 教学演示* tool visual studio2022(2019也适用)* * copyright 2023.10* COPYR…...
Qt之模块介绍
Qt提供了很多功能模块,我们需要知道的是这些模块有些加入了标准库,有一些并没有加入到标准库。至于为什么没有加入到标准库通过chatgpt得到的答案如下: Qt 是一个强大的跨平台 C 框架,它包括了很多核心模块和功能,以支…...
Socks5代理和代理IP
在数字时代,网络工程师必须不断掌握新技术,以解决跨界电商、爬虫数据采集、出海业务扩展、网络安全保护以及游戏性能优化等各种技术挑战。本文将深入探讨Socks5代理和代理IP技术,它们在各个领域中的应用,如何为网络工程师提供了强…...
计算机指令、机器码
目录 背景 在软硬件接口中,CPU 帮我们做了什么事? 从编译到汇编,代码怎么变成机器码? 解析指令和机器码 总结延伸 背景 上大学的时候,我们系里教 C 语言程序设计的老师说,他们当年学写程序的时候&…...
MyLife - Docker安装Consul
Docker安装Consul 个人觉得像consul之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装consul使用。 1. Consul 镜像库地址 Consul 镜像库地址:https://hub.docker.com/r/hashicorp/consu…...
Leetcode刷题笔记--Hot61-70
1--课程表(207) 主要思路: 用 in 记录每一门课程剩余的先修课程个数,当剩余先修课程个数为0时,将该课程加入到队列q中。 每修队列q中的课程,以该课程作为先修课程的所有课程,其剩余先修课程个数…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
