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

2024-03-20 18:40

本文主要是介绍目录启示: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

这篇关于目录启示:PHP 与命名空间的声明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830394

相关文章

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁