目录启示: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、编程式事务管理…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...