目录启示:使用 use 关键字为命名空间内的元素建立非限定名称

文章目录

  • 参考
  • 环境
  • 三种名称
      • 非限定名称
      • 限定名称
      • 完全限定名称
      • 举个栗子
  • use
      • use 关键字
      • use ... as ..
  • 命名冲突
      • 真假美猴王
      • 两个世界

参考

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

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器PhpStorm 2023.1.1(专业版)

三种名称

在 PHP 命名空间的上下文中,限定名称 (Qualified Name)、非限定名称 (Unqualified Name) 与完全限定名称 (Fully Qualified Name) 是 三种引用命名空间中的元素(类、接口、函数 与 常量)的方式

非限定名称

非限定名称是一个 不包含任何命名空间前缀的名称,如 ClassName 就是一个非限定名称。当使用非限定名称时,PHP 会 优先在当前命名空间中查找该元素。若该原始不存在于当前命名空间中,则将在全局命名空间中对其进行查找(仅当被查找元素为函数或常量时)

限定名称

限定名称包含 命名空间前缀,但没有开头的反斜线 \(该反斜线表示全局命名空间)。如 NamespaceName\ClassNameNamespaceName\functionName() 就是限定名称。当使用限定名称时,PHP 会 基于当前命名空间来解析该名称

完全限定名称

完全限定名称从反斜线 \(该反斜线表示全局命名空间) 开始,后接命名空间或元素的名称。如 \Full\NamespaceName\ClassName\Full\NamespaceName\functionName() 就是完全限定名称。当使用完全限定名称时,PHP 会 完全忽略当前命名空间的上下文,并从全局上下文解析名称

举个栗子

<?phpnamespace HOME\RedHeart {function saySelf() {# 通过魔术常量 __NAMESPACE 回当前所属的命名空间名称return __NAMESPACE__;}function saySon() {# 尝试访问当前命名空间中的子命名空间 BinaryMoon 中的 saySelf() 函数return BinaryMoon\saySelf();}
}namespace HOME\RedHeart\BinaryMoon {function saySelf() {return __NAMESPACE__;}
}# 全局命名空间
namespace {# 尝试访问 HOME\RedHeart\BinaryMoon 命名空间下的 saySelf() 函数var_dump(\HOME\RedHeart\BinaryMoon\saySelf());# 尝试访问 HOME\RedHeart 命名空间下的 saySelf() 函数var_dump(HOME\RedHeart\saySelf());# 尝试访问 HOME\RedHeart 命名空间下的 saySon() 函数var_dump(\HOME\RedHeart\saySon());
}

执行效果

string(24) "HOME\RedHeart\BinaryMoon"
string(13) "HOME\RedHeart"
string(24) "HOME\RedHeart\BinaryMoon"

use

use 关键字

在 PHP 中,use 关键字用于导入命名空间中的 接口函数常量,以便在当前命名空间中直接使用这些元素的 非限定名称,有助于提高开发体验😎。对此,请参考如下示例:

<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {# 将 \HOME\RedHeart\BinaryMoon\ 命名空间下的# MyClass 类导入至当前命名空间,便可以使用非限定名称访问该类。use \HOME\RedHeart\BinaryMoon\MyClass;var_dump(new MyClass());# 将 \HOME\RedHeart\BinaryMoon\ 命名空间下的# 函数 sayHello 与常量 CONSTANT 导入当前命名空间use function HOME\RedHeart\BinaryMoon\sayHello;use const HOME\RedHeart\BinaryMoon\CONSTANT;sayHello();print(CONSTANT . "\n");
}

执行效果

在 PHP 中,use 关键字的默认操作对象是 。若您需要将 函数常量 导入至当前命名空间,请在 use 关键字后添加 functionconst 以告知 PHP 解释器。

object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon

use … as …

在 PHP 中,use ... as ... 语句用于导入命名空间中的 接口函数常量并为它们创建一个 别名,以便可以在当前代码块中使用别名来引用相关的元素。对此,请参考如下示例:

<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {use \HOME\RedHeart\BinaryMoon\MyClass as AnClass;use function HOME\RedHeart\BinaryMoon\sayHello as speakHello;use const HOME\RedHeart\BinaryMoon\CONSTANT as ANCONSTANT;var_dump(new AnClass());speakHello();print(ANCONSTANT . "\n");
}

执行效果

object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon

命名冲突

真假美猴王

<?phpnamespace BinaryMoon {class BinaryMoon {}
}

在上述示例中,命名空间 BinaryMoon 与其 类元素 BinaryMoon 使用相同名称。按照正常情况,两者将发生 命名冲突,但上述示例却能够正常执行。这是由于,命名空间 BinaryMoon 的完全限定名称是 \BinaryMoon,而 类元素 BinaryMoon 的完全限定名称是 \BinaryMoon\BinaryMoon,两者的名称 并不真的相同

两个世界

实际上,命名空间与其他元素之间并不会产生命名冲突,即使两者的完全限定名称一模一样。对此,请参考如下示例:

<?phpnamespace BinaryMoon {}namespace {class BinaryMoon {}var_dump(new \BinaryMoon());
}

执行效果

在使用 class 关键字创建类 BinaryMoon 后,类与命名空间具有相同的完全限定名称 \BinaryMoon,这并不会导致两者发生 命名冲突,PHP 会 依据具体情景进行分析来确定如何解析该名称。但程序并非完美的,它无法应对所有可能的场景,鉴于此,请 尽可能不要尝试使用相同的名称

object(BinaryMoon)#1 (0) {
}

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

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

相关文章

JavaSE学习值之--认识异常

&#x1f495;"有效知识的前提是承认知识边界&#xff0c;承认我们对边界那边的一切无可奉告。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习值之--认识异常 一.什么是异常&#xff1f; 异常就是程序在运行的时候产生的不正常的行为 …

Ubuntu的Python从2.x升级到3.x

我的Ubuntu系统默认是2.7,我想升级为3.5 升级python3.5 下载python sudo apt-get install python3查看 刚才下载的Python程序被安装在usr/local/lib/python3.5 中 cd usr/local/lib备份一下 sudo cp /usr/bin/python /usr/bin/python_bak删除python的旧关联 sudo rm -rf py…

如何降低海康、大华等网络摄像头调用的高延迟问题(二)

目录 1.RTSP介绍 2.解决办法1 3.解决办法2 1.RTSP介绍 RTSP&#xff08;Real-time Streaming Protocol&#xff09;是一种用于实时流媒体传输的网络协议。它被设计用于在服务器和客户端之间传输音频、视频以及其他流媒体数据。 RTSP协议允许客户端通过与服务器建立RTSP会话…

Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析

引言 在使用 Easysearch 时&#xff0c;如何在存储和查询性能之间找到平衡是一个常见的挑战。Easysearch 具备多种压缩模式&#xff0c;各有千秋。本文将重点探讨一种特别的压缩模式&#xff1a;zstd source_reuse&#xff0c;我们最近重新优化了 source_reuse,使得它在吞吐量…

【linux】日志和journalctl 管理查看日志

目录 既看即用 简略介绍 linux的日志类型 系统日志 介绍 区别的简单说明 区别的详细说明 journalctl是什么&#xff1f;&#xff08;查看系统日志的工具&#xff09; 详细内容 linux的日志类型 systemd日志&#xff08;systemd-journald&#xff09; 放在哪个目录 …

Linux系统编程详解

Linux 多线程编程 什么是线程&#xff1f; 与线程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制 线程是轻量级的进程&#xff08;LWP&#xff1a;Light Weight Process&#xff09;&#xff0c;在 Linux 环境下线程的本 质仍是进程。 一个进程可以包含多个线…

[ROS2系列] ubuntu 20.04测试rtabmap 3D建图(二)

接上文我们继续 如果我们要在仿真环境中进行测试&#xff0c;需要将摄像头配置成功。 一、配置位置 sudo vim /opt/ros/foxy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf 二、修改 <joint name"camera_rgb_optical_joint" type"fixed&…

介绍6种解决电脑找不到vcomp140.dll,无法继续执行代码的方法。

在编程和软件开发领域&#xff0c;我们经常会遇到各种错误和问题。其中&#xff0c;找不到vcomp140.dll文件导致无法继续执行代码是一个非常常见的问题。这个问题可能会影响到软件的正常运行&#xff0c;甚至导致整个项目延期。因此&#xff0c;我们需要找到解决方案来解决这个…

如何导出带有材质的GLB模型?

1、为什么要使用 GLB 模型? GLB格式&#xff08;GLTF Binary&#xff09;是一种用于存储和传输3D模型及相关数据的文件格式&#xff0c;具有以下优点和作用&#xff1a; 统一性&#xff1a;GLB是一种开放标准的3D文件格式&#xff0c;由Khronos Group制定和维护。它融合了GL…

C# 图解教程 第5版 —— 第6章 方法

文章目录 6.1 方法的结构6.2 方法体内部的代码执行6.3 局部变量6.3.1 类型推断和 var 关键字6.3.2 嵌套块中的局部变量 6.4 局部常量6.5 控制流6.6 方法调用&#xff08;*&#xff09;6.7 返回值&#xff08;*&#xff09;6.8 返回语句和 void 方法6.9 局部函数6.10 参数&#…

mysql面试题50:500台数据库,如何在最快时间之内重启

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:500台db,如何在最快时间之内重启呢? 如果需要在最快时间内重启500台数据库,可以考虑采用并行化和自动化的方法来提高效率。比如: 编写自动化脚…

vh、vw、vmin、vmax

1、分别是什么&#xff1f; vh:指屏幕可见视窗的高&#xff0c; vw:指屏幕可见视窗的宽&#xff0c; vmin:vh和vw之间选较小的值&#xff0c; vmax:vh和vw之间选较大的值。 2、和百分比的区别 百分比时基于父元素的宽高&#xff0c;而vh\vw\vmin\vmax基于屏幕可见视图的宽…

protobuf 插件(option)使用

protobuf的option使用 一、需求 来源于工作中的一个需求&#xff1a;在传递message时需要对message中不同的字段进行不同的处理&#xff0c;而处理方式通过注释标注在了每个字段的定义后。 类似于有下面这样一个消息&#xff1a; 其中字段1是始终需要的&#xff0c;字段2和3…

Mall脚手架总结(五) —— SpringBoot整合MinIO实现文件管理

前言 在项目中我们经常有资源的上传和下载的功能需求&#xff0c;比如用户头像、产品图片、配置文件等等&#xff0c;大数据量的文件存储无疑需要更高性能的数据存储服务&#xff0c;对于无需对结构实现复杂查询的文件对象来说&#xff0c;对象存储服务无疑是一个较好的选择&am…

uniapp编译到小程序Component is not found in path “components/energy/illumination“

Component is not found in path "components/energy/illumination" 直接清除缓存重新编译

Ubuntu下怎么配置vsftpd

2023年10月12日&#xff0c;周四中午 目录 首先要添加一个系统用户然后设置这个系统用户的密码给新创建的系统用户创建主目录启动vsftpd服务查看vsftpd服务的状态打开外界访问vsftpd服务所需的端口获取服务器的IP地址大功告成 首先要添加一个系统用户 useradd 用户名然后设置…

APP备案避坑指南,值得收藏

目录 什么时间节点前需完成备案&#xff1f; APP/小程序一定要做备案吗&#xff1f; 涉及前置审批的APP有哪些&#xff1f; APP 支持安卓、IOS 多个运行平台&#xff0c;应该备案多少次&#xff1f; 企业是自有服务器&#xff0c;该如何进行APP备案&#xff1f; APP备案可…

【Spring框架】Spring监听器的简介和基本使用

目录 一、观察者模式 1.1 模型介绍 1.2 观察者模式Demo 1.2.1 观察者实体 1.2.2 主题实体 1.2.3 测试代码 二、Spring监听器的介绍 2.1 事件&#xff08;ApplicationEvent&#xff09; 2.1.1 Spring内置事件 2.1.2 Spring内置事件 2.2 事件监听器&#xff08;Applic…

三大方法快速发现商业规律

文章目录 三大方法快速发现商业规律一、市场调研二、数据分析三、案例分析 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查…

PHP LFI 利用临时文件Getshell

PHP LFI 利用临时文件 Getshell 姿势-安全客 - 安全资讯平台 LFI 绕过 Session 包含限制 Getshell-安全客 - 安全资讯平台 目录 PHP LFI 利用临时文件Getshell 临时文件 linux 和 windows的 临时文件存储规则 linux和windows对临时文件的命名规则 PHPINFO()特性 原理 条…