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

news2024/11/25 16:46:32

文章目录

  • 参考
  • 环境
  • 命名空间
      • 概念
      • 版本支持
      • 影响范围
  • 全局命名空间
      • 概念
      • 魔术常量 \_\_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__,它将返回 一个包含当前命名空间名称的字符串

举个栗子

<?php


function func() {
    return __NAMESPACE__;
}

var_dump(__NAMESPACE__);
var_dump(func());

执行效果

由于 全局命名空间没有具体的名称,故在全局命名空间中访问 __NAMESPACE__ 常量将获得一个空字符串。

string(0) ""
string(0) ""

声明全局命名空间

在 PHP 中,使用 namespace 关键字用于命名空间的定义。定义全局命名空间可参考如下示例:

<?php


namespace {
    # 括号范围内即全局命名空间。
    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 将被视为同一命名空间。对此,请参考如下示例:

<?php


namespace RedHeart {
    # 名为 RedHeart 的命名空间中定义一个名为 HOME 的常量
    const HOME = "BinaryMoon";
}

namespace REDHEART {
    # 尝试在名为 REDHEART 的命名空间中对 HOME 常量进行访问
    var_dump(HOME);
}

执行效果

RedHeart 命名空间中的常量被 REDHEART 命名空间中的语句成功访问,这说明两者为同一命名空间,命名空间的名称是 不区分大小写的

string(10) "BinaryMoon"
核心命名空间

在 PHP 中,以 PHP 作为名称开头的命名空间通常用于表示 PHP 本身的 核心命名空间。这些命名空间用于组织 PHP 语言 内置的类、接口、函数和常量。虽然您可以在自己的代码中创建以 PHP 开头的命名空间,但最好不要这样做,以 避免混淆和冲突

子命名空间的声明

在 PHP 中,子命名空间是指在一个已存在的命名空间内创建 更具体或更深层次的命名空间。子命名空间是一种用于更好组织和分类代码的方式,允许您 在一个已有的命名空间下创建更多的子级命名空间。子级命名空间与父级命名空间之间使用斜杠 \ 进行分隔。对此,请参考如下内容:

<?php


namespace 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>
    <?php
        namespace BinaryMoon;
    ?>
</body>
</html>

正常运行

<?php


# declare 的功能不必在意,此处仅仅为了表达 
# 仅有 PHP 起始标签与 declare 语句可以出现在所有命名空间之前(之外)。
declare(ticks=1);
namespace BinaryMoon {}

命名空间之间不允许嵌套

使用有括号命名空间会让人尝试进行命名空间嵌套,但这是不被 PHP 允许的,若您尝试这样做,PHP 将抛出 Fatal Error 异常。对此,请参考如下示例:

<?php


namespace RedHeart {
    # 尝试在 RedHeart 命名空间内部声明 BinaryMoon 命名空间
    namespace BinaryMoon {

    }
}

执行效果

PHP Fatal error:  Namespace declarations cannot be nested in C:\test.php on line 6

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

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

相关文章

【Python学习笔记】类型/运算/变量/注释

前言 人生苦短&#xff0c;追求生产力&#xff0c;做一只时代风口的猪&#xff0c;应该学python Python语言中&#xff0c;所有的数据都被称之为对象。 1. 对象类型 Python语言中&#xff0c;常用的数据类型有&#xff1a; 整数&#xff0c; 比如 3 小数&#xff08;也叫浮…

如何查找文献,如何阅读文献

一、高效查找需要阅读的文献 1、首先进入知网的高级检索页&#xff0c;点击“学术期刊”&#xff0c;你会看到“来源类别”选择&#xff0c;在这个里选择北核和C刊 2、在检索结果页选择一篇自己感兴趣的文章&#xff0c;点击篇名进入文章详情页&#xff0c;下拉可看到核心文献…

高速数字化仪和AWG在车辆总线(CAN/LIN/PSI5)测试中的应用(二)

前情回顾 上期德思特向大家介绍了德思特模块化数字化仪在车辆测试中的应用&#xff0c;8到16位的通道&#xff0c;高达5 GS/s的采样率允许选择与应用相匹配的快速或慢速采样&#xff0c;即使缺少组件&#xff0c;它们也可以进行测试。这期将为大家介绍如何使用信号源进行仿真&…

呼吁社区共同维护Sui品牌和商标

Sui社区成员可以通过举报Sui商标和品牌资产的不当使用来帮助保护网络的信誉。Sui商标政策解释了logo和名称的可接受和不可接受的使用方式。这些展示代表Sui面向公众&#xff0c;而善意行为者的正确使用有助于维护Sui的声誉。 Sui网络在公众中享有良好声誉&#xff0c;Sui社区都…

遥感影像的面向对象方法

面向对象分割算法是一种将图像中的像素分割成不同的对象的算法。它通过对像素进行聚类&#xff0c;将相似的像素分为同一个对象&#xff0c;从而实现图像分割的目的。常见的面向对象分割算法包括基于区域的分割算法、基于边缘的分割算法和基于能量的分割算法等。 其中&#xff…

【2023年11月第四版教材】专题1 - 计算题考点汇总 (合集篇)

专题1 - 计算题考点汇总 (合集篇&#xff09; 1 进度类1.1 PERT三点估算1.1.1 β分布1.1.2 三角分布 1.2 单代号网络图1.2.1 画图1.2.2 找关键路径1.2.3 计算总工期1.2.4 总时差1.2.5 自由时差1.2.6 工期压缩 1.3 双代号网络图1.4 双代号时标网络图1.4.1 画图1.4.2 找关键路径1…

大公司产品经理都用哪些原型工具?

原型设计工具的应用场景包括产品展示、产品需求规划和抽象到具体呈现&#xff0c;那么如何根据应用场景选择合适的原型工具呢&#xff1f;不用说&#xff0c;本文列出了常用的原型设计工具&#xff0c;看看你最想选择哪一个&#xff01; 即时设计 即时设计是国内一款专业级的…

java非文本文件copy

文本文件使用字符流来处理 非文本文件使用字节流来处理 字节流处理代码整理 public void copyFile(String srcPath, String desPath) {FileInputStream fileInputStream null;FileOutputStream fileOutputStream null;try {File srcFile new File(srcPath);File desFile ne…

链表(3):双链表

引入 我们之前学的单向链表有什么缺点呢&#xff1f; 缺点&#xff1a;后一个节点无法看到前一个节点的内容 那我们就多设置一个格子prev用来存放前面一个节点的地址&#xff0c;第一个节点的prev存最后一个节点的地址&#xff08;一般是null&#xff09; 这样一个无头双向…

Dart-C、Dart-Kotlin/Java/Swift/Object-C、Kotlin-C数据类型对照表

参考一&#xff1a;Dart FFI 数据类型映射 一、Dart—C 的数据类型对照 二、Dart—Java/Kotlin/Object-C/Swift 的数据类型对照 三、C—Kotlin 的数据类型对照

WordPress发布文章上传图片如何默认选择全尺寸

最近发现每次上传图片插入到文章中&#xff0c;图片默认选择缩略图大小并靠左&#xff0c;每次都需要手动修改一下图片信息&#xff0c;比较麻烦。 今天为大家提供修改默认上传图片大小和对齐方式等。 将代码添加到functions.php&#xff1a; //WordPress 设置图片的默认显示…

Qt 样式表大全整理

【QT】史上最全最详细的QSS样式表用法及用例说明_qt样式表使用大全_半醒半醉日复日&#xff0c;花落花开年复年的博客-CSDN博客 QT样式表的使用_qt 设置按下 release hover 按钮样式表_create_right的博客-CSDN博客 QPushButton {border-image: url(:/Start_Stop.png); } QPu…

H5营销观察:场景应用的重要性

H5营销是很常见的营销方式&#xff0c;通常用于各种营销活动和推广活动。对于品牌部或市场部人员&#xff0c;提到“场景化营销”&#xff0c;很多人的第一反应就是如何制作一个有创意、能快速传播的H5。 似乎H5营销已经成为市场人专业度的考量&#xff0c;不论是品牌宣传、活动…

001flutter基础学习

flutter基础学习 参考:https://book.flutterchina.club/chapter1/flutter_intro.html Flutter是谷歌的移动UI框架跨平台: Linux,Android, IOS,Fuchsia原生用户界面:它是原生的,让我们体验更好,性能更好开源免费&#xff1a;完全开源,可以进行商用Flutter与主流框架的对比 Cor…

Rt-Thread 移植4--对象容器实现(KF32)

1.对象 1,1 什么是对象 所有的数据结构都是对象 1.2代码实现 1.2.1 对象类型枚举定义 rtdef.h 添加rt_object_class_type enum rt_object_class_type{RT_Object_Class_NULL0,RT_Object_Class_Thread ,RT_Object_Class_Semaphore,RT_Object_Class_Mutex,RT_Object_Class_E…

【java学习】JavaBean(28)

文章目录 1. 概念 1. 概念 JavaBean 是一种 Java 语言写成的可重用组件。 所谓 javaBean &#xff0c;是指符合如下标准的 Java 类&#xff1a; (1) 类是公共的 (2) 有一个无参的公共的构造器 (3) 有属性&#xff0c;属性一般是私有的&#xff0c;且有对应的 get 、set 方法 …

cad问题:无法识别的版本,不能读取

cad安装目录或文件名、新建时的文件模板&#xff0c;含有“无”这个字就会出现此问题&#xff0c;只要把 无这个字改成没&#xff0c;即可解决

Kafka进阶

Kafka进阶 Kafka事务 kafka的事务机制是指kafka支持跨多个主题和分区的原子性写入&#xff0c;即在一个事务中发送的所有消息要么全部成功&#xff0c;要么全部失败。 kafka的事务机制涉及到以下几个方面&#xff1a; 事务生产者&#xff08;transactional producer&#x…

【牛客面试必刷TOP101】Day12.BM72 连续子数组的最大和和BM80 买卖股票的最好时机(一)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

StatefulSet 简单实践 Kubernetes

概述 在Kubernetes集群中部署MySQL和Mongodb的StatefulSet服务。 MySQL有官方文档的指引 其他网站博客的指引实现 Mongodb修改operator的Deployment进行简单的实现 MySQL-StatefulSet 参考官方文档&#xff1a;运行一个有状态的应用程序 | Kubernetes 深入剖析Kubernete…