目录启示:PHP 与命名空间的声明

文章目录

  • 参考
  • 环境
  • 命名空间
      • 概念
      • 版本支持
      • 影响范围
  • 全局命名空间
      • 概念
      • 魔术常量 \_\_NAMESPACE\_\_
      • 声明全局命名空间
  • 声明命名空间
      • 为空间命名
      • 命名规则
          • 核心命名空间
  • 子命名空间的声明
  • 在同一文件中定义多个命名空间
      • 无括号命名空间声明
      • 有括号命名空间声明
      • 禁止混合使用
      • 推荐使用有括号命名空间声明
  • 注意事项
      • 命名空间之外
      • 命名空间之间不允许嵌套

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 官方PHP Manual
PHP 官方language.namespaces.rationale.php
PHP 官方control-structures.declare.php

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.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 中,命名空间 用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题

  1. 用户编写的代码与 PHP 内部或第三方的类、函数、常量等之间的 命名冲突
  2. 很长的标识符名称(通常是为了缓解第一类问题而定义的) 创建一个 别名(简短的名称) 的名称,提高源代码的可读性。

版本支持

PHP 对命名空间的支持从 5.3 版本开始,在此前的 PHP 版本中,命名空间机制处于不可用状态。

影响范围

PHP 中并不是所有组成部分都将受到命名空间的影响。在 PHP 官方文档记录了受命名空间影响的类型,具体如下:

  1. 类(包括抽象类和 trait)
  2. 接口
  3. 函数
  4. 常量

全局命名空间

概念

在 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 中定义命名空间的过程中,推荐使用有括号命名空间声明。理由有如下三点:

  1. 可读性
    使用有括号命名空间声明 可以明确指示命名空间的开始和结束,使代码更易于阅读。
  2. 全局命名空间
    全局命名空间的声明 仅能够通过有括号命名空间声明这一方式进行声明,若在 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统信UOS1060设置自动关机01

原文链接&#xff1a;统信UOS1060设置自动关机01 hello&#xff0c;大家好啊&#xff0c;今天给大家介绍一篇如何在统信UOS 1060上实现自动关机的文章&#xff0c;本篇文章采用两种方式&#xff0c;第一种使用的是crontab定时任务的方式&#xff0c;第二种是使用at命令的方式&a…

实体解析实施的复杂性

实体的艺术表现斯特凡伯克纳 一、说明 实体解析是确定数据集中的两条或多条记录是否引用同一现实世界实体&#xff08;通常是个人或公司&#xff09;的过程。乍一看&#xff0c;实体分辨率可能看起来像一个相对简单的任务&#xff1a;例如&#xff0c;给定一张人物的两张照片&a…

natapp内网穿透-将本地运行的程序/服务器通过公网IP供其它人访问

文章目录 1.几个基本概念1.1 局域网1.2 内网1.3 内网穿透1.4 Natapp 2.搭建内网穿透环境3.本地服务测试 1.几个基本概念 1.1 局域网 LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;是一个可连接住宅&#xff0c;学校&#xff0c;实验室&#xff0c;大学校…

2核4G游戏服务器推荐(阿里云/腾讯云/华为云)

2核4G游戏服务器推荐&#xff0c;首选腾讯云2核4G5M带宽轻量应用服务器218元一年、阿里云2核4G4M带宽轻量应用服务器297元一年&#xff0c;华为云2核2G3M云耀L服务器95元一年&#xff0c;阿腾云来详细说下2核4G游戏服务器推荐配置大全&#xff1a; 目录 2核4G游戏服务器推荐 …

前端 js导出excel

一、导出效果 二、导出代码 download() {let data [{name: aaaa,age: 10,address: 广东,phone: 1,wechart: 1},{name: bbbb,age: 11,address: 广西,phone: 2,wechart: 2},{name: cccc,age: 12,address: 山东,phone: 3,wechart: 3}]if (!data.length) {this.$Message.warnin…

暴力递归转动态规划(九)

题目 题有点难&#xff0c;但还挺有趣 有一个咖啡机数组arr[]&#xff0c;其中arr[i]代表每一个咖啡机冲泡咖啡所需的时间&#xff0c;有整数N&#xff0c;代表着准备冲咖啡的N个人&#xff08;假设这个人拿到咖啡后喝完的时间为0&#xff0c;拿手里咖啡杯即变空&#xff09;&a…

postman和jmete接口测试的用法与区别

前言 前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大…

【Qt】字体更大的富文本

使用size属性只能生成7个等级的字号&#xff0c;超过7的都视作为7。 当需要更加夸张的字号时则需要使用style属性&#xff0c;除此之外利用该属性可以生成更加逆天丰富的样式&#xff0c;(style属性是CSS样式表。 稍微跑题一下&#xff1a;似乎有安全性的考量&#xff0c;不少…

如何快速区分GPT-3.5 与GPT-4?

GPT 3.5 和 GPT-4 有什么区别&#xff1f; GPT-3.5 在经过大量数据训练后&#xff0c;成功地发展到可以考虑 1750 亿个参数以响应提示。这使其具备令人印象深刻的语言技能&#xff0c;以非常人性化的方式回应各种查询。然而&#xff0c;GPT-4 在更为庞大的训练数据基础上进行了…

【Qt】对话框QDialog

文章目录 **对话框**QDialog**基本概念**对话框分类标准对话框自定义消息框模态对话框非模态对话框 案例&#xff1a;点击新建按钮弹出对话框消息对话框其它标准对话框 对话框QDialog 基本概念 对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组…

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/ 0vS/TRex/dpvs技术专家成长体系教程

课程围绕安全&#xff0c;网络&#xff0c;存储&#xff0c;云原生4个维度去讲解核心技术点。 6个专栏组成&#xff1a;dpdk网络专栏、存储技术专栏、安全与网关开发专栏、虚拟化与云原生专栏、测试工具专栏、性能测试专栏 一、dpdk网络 dpdk基础知识 多队列网卡&#xff0…

采集EtherNET/IP转Profinet在西门子plc中的应用

远创智控网关YC-EIPM-PN&#xff0c;让你的设备和云平台实时连接&#xff01; 远创智控YC-EIPM-PN网关产品支持各种数据接口&#xff0c;无论是工业领域的仪表、PLC、计量设备&#xff0c;还是设备数据&#xff0c;都能实时采集并整合。它将这些设备中的运行数据、状态数据等信…

学习pytorch13 神经网络-搭建小实战Sequential的使用

神经网络-搭建小实战&Sequential的使用 官网模型结构根据模型结构和数据的输入shape&#xff0c;计算用在模型中的超参数coderunning log网络结构可视化 B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html#torch.nn.Se…

布朗大学发现GPT-4存在新问题,可通过非常见语言绕过限制

&#x1f989; AI新闻 &#x1f680; 布朗大学发现GPT-4存在新漏洞&#xff0c;可通过非常见语言绕过限制 摘要&#xff1a;布朗大学计算机科学研究人员发现了OpenAI的GPT-4存在新漏洞&#xff0c;利用不太常见的语言如祖鲁语和盖尔语可以绕过各种限制。研究人员测试了GPT-4对…

gitlab docker部署,备份,恢复。附踩坑记录

本次安装在CentOS7下进行 1、安装yum 检查是否已经安装yum yum --version如果未安装 sudo yum install -y yum-utils添加镜像源&#xff1a; 国外镜像源&#xff1a;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里镜像源&am…

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

AOMEI PXE Boot Free

两台电脑网线直连&#xff0c;不用设置固定IP&#xff0c;该软件包含DHCP。 名称: 3H3AOMEIPXEBootFree.rar 大小: 13068734 字节 (12 MiB) SHA1: 1e606c8c1ee3badf8af9a87f61fdf2e332b773e6 名称: PXEBoot.exe 大小: 13124928 字节 (12 MiB) SHA1: 95286ac18e9b81c2a68412c40…

代理IP在保护跨境商家网络安全中的重要作用

在当前全球化的背景下&#xff0c;跨境电商成为一种重要的商业模式&#xff0c;越来越多的商家涌入国际市场&#xff0c;商家们通过互联网平台将商品远销国外&#xff0c;但网络安全风险随之而来。跨境商家因为需要处理大量的在线交易和产品数据&#xff0c;如果未能对这些敏感…