目录启示:PHP 与命名空间的声明
文章目录
- 参考
- 环境
- 命名空间
- 概念
- 版本支持
- 影响范围
- 全局命名空间
- 概念
- 魔术常量 \_\_NAMESPACE\_\_
- 声明全局命名空间
- 声明命名空间
- 为空间命名
- 命名规则
- 核心命名空间
- 子命名空间的声明
- 在同一文件中定义多个命名空间
- 无括号命名空间声明
- 有括号命名空间声明
- 禁止混合使用
- 推荐使用有括号命名空间声明
- 注意事项
- 命名空间之外
- 命名空间之间不允许嵌套
参考
项目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
PHP 官方 | PHP Manual |
PHP 官方 | language.namespaces.rationale.php |
PHP 官方 | control-structures.declare.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 中的命名空间?PHP 官方文档 对此有一个很好的描述(难得通俗易懂🤐):
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法
。在很多地方都可以见到这种抽象概念。例如
,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子
,文件 foo.txt 可以同时在目录 /home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外
,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念
。
在 PHP 中,命名空间 用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题
:
- 用户编写的代码与 PHP 内部或第三方的类、函数、常量等之间的
命名冲突
。 - 为
很长的标识符名称(通常是为了缓解第一类问题而定义的)
创建一个别名(简短的名称)
的名称,提高源代码的可读性。
版本支持
PHP 对命名空间的支持从 5.3
版本开始,在此前的 PHP 版本中,命名空间机制处于不可用状态。
影响范围
PHP 中并不是所有组成部分都将受到命名空间的影响。在 PHP 官方文档中 记录了受命名空间影响的类型
,具体如下:
- 类(包括抽象类和 trait)
- 接口
- 函数
- 常量
全局命名空间
概念
在 PHP 中,全局命名空间是一个 特殊的命名空间
,该命名空间 没有具体的名称
。全局命名空间是 PHP 脚本使用的 默认命名空间
,当你在 PHP 脚本中没有显式地定义命名空间时,所有的类、函数、常量等都处于全局命名空间中。
魔术常量 __NAMESPACE__
__NAMESPACE__
是 PHP 提供的一个魔术常量,用于获取当前命名空间的名称
。您可以在任何命名空间内使用魔术常量 __NAMESPACE__
,它将返回 一个包含当前命名空间名称的字符串
。
举个栗子
<?phpfunction func() {return __NAMESPACE__;
}var_dump(__NAMESPACE__);
var_dump(func());
执行效果
由于 全局命名空间没有具体的名称
,故在全局命名空间中访问 __NAMESPACE__
常量将获得一个空字符串。
string(0) ""
string(0) ""
声明全局命名空间
在 PHP 中,使用 namespace 关键字用于命名空间的定义
。定义全局命名空间可参考如下示例:
<?phpnamespace {# 括号范围内即全局命名空间。var_dump(__NAMESPACE__);
}
执行效果
string(0) ""
声明命名空间
为空间命名
在定义命名空间的过程中,可在 namespace
关键字后指定被定义命名空间的名称。对此,请参考如下示例:
<?php# 定义一个名为 RedHeart 的命名空间
namespace RedHeart {var_dump(__NAMESPACE__);
}# 定义一个名为 BinaryMoon\RedHeart 的命名空间
namespace BinaryMoon\RedHeart {var_dump(__NAMESPACE__);
}
执行效果
string(8) "RedHeart"
string(19) "BinaryMoon\RedHeart"
命名规则
命名空间的名称 只能包含字母、数字和下划线,并且不能以数字开头
。需要注意的是,命名空间的名称的大小写并不敏感
,\RedHeart
与 \REDHEART
将被视为同一命名空间。对此,请参考如下示例:
<?phpnamespace RedHeart {# 名为 RedHeart 的命名空间中定义一个名为 HOME 的常量const HOME = "BinaryMoon";
}namespace REDHEART {# 尝试在名为 REDHEART 的命名空间中对 HOME 常量进行访问var_dump(HOME);
}
执行效果
在 RedHeart
命名空间中的常量被 REDHEART
命名空间中的语句成功访问,这说明两者为同一命名空间,命名空间的名称是 不区分大小写的
。
string(10) "BinaryMoon"
核心命名空间
在 PHP 中,以 PHP
作为名称开头的命名空间通常用于表示 PHP 本身的 核心命名空间
。这些命名空间用于组织 PHP 语言 内置的类、接口、函数和常量
。虽然您可以在自己的代码中创建以 PHP
开头的命名空间,但最好不要这样做,以 避免混淆和冲突
。
子命名空间的声明
在 PHP 中,子命名空间是指在一个已存在的命名空间内创建 更具体或更深层次的命名空间
。子命名空间是一种用于更好组织和分类代码的方式,允许您 在一个已有的命名空间下创建更多的子级命名空间
。子级命名空间与父级命名空间之间使用斜杠 \
进行分隔。对此,请参考如下内容:
<?phpnamespace RedHeart {# 创建一个位于全局命名空间下名为 RedHeart 的子命名空间
}namespace RedHeart\BinaryMoon {# 创建一个位于 \RedHeart\ 下的子空间# \RedHeart 前的 \ 表示全局命名空间,在为命名空间命名时不需要添加# 该符号。否则,PHP 将抛出 Parse error 异常。
}
在同一文件中定义多个命名空间
无括号命名空间声明
无括号命名空间声明
使用分号 ;
结束命名空间的声明。当您使用这种方式定义命名空间时,命名空间的影响将持续到文件的结束或下一个命名空间声明
。也就是说,此声明之后的所有代码都将被认为是在这个命名空间内。
有括号命名空间声明
有括号命名空间声明
使用大括号 {}
来明确地定义命名空间的范围。在这对大括号内的代码都将被认为是在这个命名空间内
,而大括号外的代码则不在此命名空间内。
禁止混合使用
在同一 PHP 脚本文件中,有括号命名空间声明与无括号命名空间声明 不能混用
。否则,PHP 将为此抛出 Fatal error
异常并立即停止运行。对此,请参考如下示例:
<?php# 使用无括号命名空间声明
namespace RedHeart;# 使用有括号命名空间声明
namespace BinaryMoon {}
执行效果
Fatal error: Cannot mix bracketed namespace declarations with unbracketed namespace declarations in C:\demo.php on line 8
PHP Fatal error: Cannot mix bracketed namespace declarations with unbracketed namespace declarations in C:\demo.php on line 8
推荐使用有括号命名空间声明
在 PHP 中定义命名空间的过程中,推荐使用有括号命名空间声明。理由有如下三点:
- 可读性
使用有括号命名空间声明可以明确指示命名空间的开始和结束
,使代码更易于阅读。 - 全局命名空间
全局命名空间的声明仅能够通过有括号命名空间声明这一方式进行声明
,若在 PHP 脚本文件中使用无括号命名空间声明,则无法声明全局命名空间(有括号命名空间声明与无括号命名空间声明不可混用)
。
注意事项
命名空间之外
当您在 PHP 脚本中 声明任意命名空间
后,仅能够在所有命名空间前使用 declare
语句及 PHP 起始标签 <?php
。除此之外,不允许在名称空间范围外使用任何非空白字符
。否则,PHP 将抛出 Fatal error
并立即停止运行。对此,请参考如下示例:
产生 Fatal error 异常
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Namespace</title>
</head>
<body><?phpnamespace BinaryMoon;?>
</body>
</html>
正常运行
<?php# declare 的功能不必在意,此处仅仅为了表达
# 仅有 PHP 起始标签与 declare 语句可以出现在所有命名空间之前(之外)。
declare(ticks=1);
namespace BinaryMoon {}
命名空间之间不允许嵌套
使用有括号命名空间会让人尝试进行命名空间嵌套,但这是不被 PHP 允许的,若您尝试这样做,PHP 将抛出 Fatal Error
异常。对此,请参考如下示例:
<?phpnamespace RedHeart {# 尝试在 RedHeart 命名空间内部声明 BinaryMoon 命名空间namespace BinaryMoon {}
}
执行效果
PHP Fatal error: Namespace declarations cannot be nested in C:\test.php on line 6
相关文章:

目录启示:PHP 与命名空间的声明
文章目录 参考环境命名空间概念版本支持影响范围 全局命名空间概念魔术常量 \_\_NAMESPACE\_\_声明全局命名空间 声明命名空间为空间命名命名规则核心命名空间 子命名空间的声明在同一文件中定义多个命名空间无括号命名空间声明有括号命名空间声明禁止混合使用推荐使用有括号命…...

D. Divide and Equalize--Codeforces Round 903 (Div. 3)
D. Divide and Equalize 题意:让一组数中的一个数除以一个因子,一个数除以一个因子,假如经过若干次操作后能够使数组所有数相等,那么输出YES,否则输出NO。 分析:乘除因子,那么实际上就是因子的…...

保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题
文章目录 参考文章安装JDK并配置环境变量安装JDK配置JDK相关的环境变量 Android studio 安装下载Android studiogradle下载慢解决方法 安装Android SDK选择jdk版本安装SDK并配置环境变量 参考文章 原文链接 原文链接 安装JDK并配置环境变量 安装JDK 下载地址 下载后双击安装…...

Ps:选区的布尔运算
选区的布尔 Boolean运算指的是选区之间的相加(并集)、相减(差集)以及相交(交集),从而形成一个新的选区。 ◆ ◆ ◆ 使用工具选项栏 在 Ps 中,几乎所有的选区工具的工具选项栏上都有…...

PyTorch 深度学习之卷积神经网络(基础篇)Basic CNN(九)
0. Revision: Fully connected Neural Network 全连接 1. Convolution Neural Network 保留空间信息 1.1 Convolution Convolution-Single Input Channel 单通道 数乘 3 input Channels 3通道 N input Channels N input Channels and M output channel M 个卷积核 1.2 conv…...

torch实现Gated PixelCNN
文章目录 PixelCNNGated PixelCNN PixelCNN import torch import torch.nn as nn import torch.nn.functional as F# Pixel CNNclass MaskConv2d(nn.Module):def __init__(self, conv_type, *args, **kwags):super().__init__()assert conv_type in (A, B)self.conv nn.Conv2…...

破局「二次创业」:合思的新解法
在新的水温下,寻找更为良性的发展正在成为企业的必答题。对此,合思给出的不仅是一份更“省”的答题方法。也更是从认知层到行动层,最后到工具层的一张授人以渔的“渔网”。 作者|思杭 编辑|皮爷 出品|产业家 今年4月初,广州…...

第五章:TCP和UDP基本原理
TCP和UDP基本原理 一、TCP/IP传输层的作用二、 端口1.范围2. 服务端3. 客户端4. 常见知名端口号4.1 TCP 80 HTTP4.2 TCP 20 21 FTP4.3 TCP 23 TELNET4.4 TCP 25 SMTP4.5 UDP 53 DNS4.6 TCP 443 HTTPS 三、 TCP原理1. TCP头部封装格式1.1 Source Port 源端口1.2 Destination Por…...

算法:动态规划的入门理解
文章目录 算法原理题目解析第n个泰波那契数列三步问题使用最小花费爬楼梯 从本篇开始总结的是动态规划的一些内容,动态规划是算法中非常重要的一个版块,因此也是学习算法中的一个重点,在学习动态规划前应当要把动态规划的基础知识学习一下 算…...

最新版nacos 2.2.3服务注册与发现版本依赖问题
最新版nacos的注册服务时配置文件写的是对的,但就是在nacos web页面无法看见服务,此时你需要注意你的依赖是否正确 spring: application:name: orderservicecloud:nacos:discovery:server-addr: 122.51.115.127:8848父工程依赖:现在最新的s…...

2023年中国合同能源管理行业研究报告
第一章 行业概况 1.1 定义及分类 合同能源管理 (Energy Performance Contracting, EPC) 是当前能源行业中一个重要的概念,它构建了一个桥梁,将节能服务公司 (Energy Management Company, EMCo) 与用能单位紧密联系在一起。通过特定的契约形式ÿ…...

php以半小时为单位,输出指定的时间范围
//可预订小时范围$hour [];for ($i$startHour*3600;$i<$endHour*3600;$i1800){//以半小时为单位输出$startHourItem date(H:i,strtotime(date(Y-m-d))$i);//小时开始$endHourItem date(H:i,strtotime(date(Y-m-d))$i1800);//当前时间再加半小时$hourItemStr $startHourI…...

Electron应用的 asar 打包 解压
前言: .asar文件是一种归档文件格式,通常用于封装Electron应用程序的资源。Electron是一个使得开发者能够使用Web技术构建跨平台桌面应用程序的框架。为了提高性能和简化部署,Electron应用程序的资源通常会被打包到一个.asar文件中。 安装 as…...

蓝桥等考Python组别十七级003
第一部分:选择题 1、Python L17 (15分) 运行下面程序,输出的结果是( )。 def func(x, y): return (x + y) // 3 print(func(7, 5)) 2468正确答案:B 2、Python L17 (15</...

Redis概述和与SpringBoot的整合
Redis是一种高性能的键值对存储数据库,它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。Redis具有快速、可靠、灵活和可扩展等特点,也被广泛应用于缓存、队列和排行榜等场景。 SpringBoot是一种基于Spring框架的快速开发脚手…...

Python 中的 round() 函数:实现精确的数值舍入操作
round(x, n) 函数用于对数值 x 进行舍入操作,并指定保留的小数位数为 n。它的工作原理如下: 如果 x 的小数位数小于等于 n,则直接返回 x 本身。例如,round(3.1415, 2) 将返回 3.14。 如果 x 的小数位数大于 n,则按照四…...

在springboot中如何开启Bean数据校验
①:添加JSR303规范坐标与Hibernate校验框架对应坐标 <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId> </dependency><dependency><groupId>org.hibernate.validator<…...

【C语言好题系列三】
文章目录 学习导航一. 选择题二. 编程题(力扣/牛客网)三. 总结 学习导航 一. 选择题 如下程序的运行结果是(D) char c[5]{a, b, \0, c, \0}; printf("%s", c);A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab 答案解析: 正…...

ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍
一、ES的数据存储结构: ES底层使用 Lucene 存储数据,Lucene 的索引包含以下部分: A Lucene index is made of several components: an inverted index, a bkd tree, a column store (doc values), a document store (stored fields) and te…...

[Spring]事务的传播机制
一、背景 Mysql在修改完数据后,默认会自动触发事务Commit提交。 而在我们服务的一个方法里,需要多次修改Mysql记录。 为了保证原子性,我们需要将Mysql设为手动提交,多次修改后再commit提交。 二、Spring事务 1、编程式事务管理…...

linux下,如何查看一个文件的哈希值md5以及sha264
在linux终端中,可能存在多个相似的文件,而哈希值可以唯一确定一个文件。文件的哈希值计算可以有以下两种方式,MD5和SHA256,现将两种方式罗列如下: 1、MD5 命令:$ md5sum FileName 一个文件的 MD5 是固定的…...

Java类加载过程
一、前言 我们都知道计算机的底层逻辑都是0和1的编码,当然除了现在所研究的量子计算除外。那么我们在计算机所做的一切操作,底层原理是不是都可以翻译到0和1呢。如果刨根问底的话,可以这么说,当然0和1的表示也属于逻辑门电路电的…...

人脸活体检测技术的应用,有效避免人脸识别容易被攻击的缺陷
随着软件算法和物理终端的进步,人脸识别现在越来越被广泛运用到生活的方方面面,已经成为了重要的身份验证手段,但同时也存在着自身的缺陷,目前常规人脸识别技术可以精准识别目标人像特征,并迅速返回比对结果࿰…...

大数据发展史
一、hadoop发展史 hadoop创始人Doug Cutting,主要为了实现Google类似全文搜索功能,该功能是基于Lucene框架进行优化升级,索引引擎; 2001年底Lucence成为Apache基金会的一个子项目,当时为了解决存储海量数据困难,检索海量速度慢,可以说Google是hadoop的思想之源; GFS…...

有关范数的学习笔记
向量的【范数】:模长的推广,柯西不等式_哔哩哔哩_bilibili 模长 范数 这里UP主给了说明 点赞 范数理解(0范数,1范数,2范数)_一阶范数-CSDN博客 出租车/曼哈顿范数 det()行列式 正定矩阵(Posit…...

如何通过MES系统提高生产计划效率?
导 读 ( 文/ 1730 ) 在现代制造业中,通过制造执行系统(MES)系统来提高生产计划效率是至关重要的。本文将介绍如何通过MES系统来优化生产计划,包括实时数据分析、智能排程和协同协作。通过这些关键方法,企业可以提高生产…...

持续提升信息安全运维保障服务能力,天玑科技助力企业快速实现数字化转型
近年来,以互联网、云计算、大数据、物联网为代表的新一代信息技术快速发展。给人们的生产生活方式带来方便的同时,也给信息系统的安全带来了严峻的挑战。我国信息化和信息安全保障工作的不断深入推进,以应急处理、风险评估、灾难恢复、系统测…...

【PostgreSQL启动,停止命令(重启)】
找到 /usr/lib/systemd/system文件夹路径看是否包含 postgresql服务 关闭服务: systemctl stop postgresql-12.service启动服务 systemctl start postgresql-12.service重启服务 systemctl restart postgresql-12查看状态 systemctl status postgresql-12.servi…...

TLS 详解
目录 TLS 定义HTTPS HTTP over TLS.加密记录层分片 (Fragmentation)记录压缩和解压缩 (Record compression and decompression)空或标准流加密 (Null or standard stream cipher)CBC 块加密 (分组加密)记录有效载荷保护 (Record payload protection)密钥计算 (Key calculation…...

【重拾C语言】十、递归程序设计
目录 前言 十、递归程序设计 10.1 计算n!——递归程序设计 10.2 程序设计实例 10.2.1 汉诺塔 10.2.2 齿轮 10.2.3 组合 10.3 计算算术表达式的值——间接递归 10.4 递归程序执行过程 前言 递归程序设计是一种编程技术,其中一个函数通过调用自身…...