PHP的namespace

文章目录

  • 环境
  • Java的package
    • package关键字
    • 包结构和目录结构
    • 访问权限
    • import关键字
    • 总结
  • PHP的namespace
    • namespace关键字
    • 在同一个文件里使用资源
      • 限定,完全限定,非限定
        • 限定
        • 完全限定
        • 非限定
    • use关键字
    • use VS 直接指定资源
    • 在不同的文件里使用
    • 总结

环境

  • Windows 11 专业版
  • PHP 8.2.12

Java的package

在学习PHP的namespace之前,先来复习一下Java的package。

package关键字

Java使用 package 关键字来声明包,支持多级结构,各级之间以 . 分隔。

一般全部使用小写字母,使用倒序,比如: com.mycompany.myproject.mypackage

例如:

  • MyClass1.java
package mypkg1.mysubpkg1; // 声明packagepublic class MyClass1() {
......
}
  • MyClass2.java
package mypkg2.mysubpkg1; // 声明packageimport mypkg1.mysubpkg1.MyClass1; // 引入MyClass1public class MyClass2() {public static void main(String[] args) {var obj = new MyClass1();......}
......
}

包结构和目录结构

在Java里,包结构和实际文件的目录结构必须保持一致,如果不一致则编译报错。

比如包名是 com.mycompany.myproject.mypackage ,则实际目录结构必须是 com/mycompany/myproject/mypackage 。其中 com 目录是在Java源代码的根目录下。

此外,如果Java文件包含了public类(一个Java文件里最多只能有一个public类),则文件名必须与该类的命名一致,参见上面的例子。

访问权限

Java的包会影响访问权限。

我们知道,Java的访问修饰符如下:

  • public :在任何地方都可见
  • protected :只在同一个包,以及子类中可见
  • 缺省(包访问权限):只在同一个包中可见
  • private :只在本类内部可见

注意:一个Java文件里可以定义多个类,它们也是在同一个包里的(但一个Java文件里最多只能有一个public类)。

访问修饰符同一个类同一个包不同包的子类不同包的非子类
publicYYYY
protectedYYYN
缺省YYNN
privateYNNN

import关键字

Java通过 import 关键字来引入包资源。由于包结构和实际文件目录结构一致,所以 import 既指定了包结构,也指定了目录结构(这和PHP是不同的)。

在import语句中,可以指定一个资源,也可以使用通配符 * ,比如:

  • import java.util.List
  • impport java.util.*

使用 import 来引入资源后,接下来就可以直接使用资源,而不需要指定资源的全限定名了,比如:

import java.util.ArrayList;
......ArrayList<String> list = new ArrayList<>();

注意:如果不通过 import 来引入资源,也可以使用资源,只不过每个用到资源的地方,都需要指定全限定名,比如:

        java.util.ArrayList<String> list = new java.util.ArrayList<>();

总结

  • 使用 package 关键字来声明包,各级之间以 . 分隔
  • 包结构和实际文件目录结构必须一致
  • 包可以影响访问权限
  • 通过 import 关键字来引入包资源,简化使用

PHP的namespace

namespace关键字

PHP通过 namespace 关键字来定义命名空间,对于多级命名空间,不同层级之间用 \ 分隔,比如:

namespace MyProject\Controllers;class MyClass1 {......
}

注:遵循 PSR-4 标准,使用首字母大写(PascalCase)。

注意:namespace 后面不用加引号,但是 requireinclude 后面需要加引号,比如:

namespace MyProject\Controllers;require 'test0602_1.php';
......

实际上,PHP的namespace有两种写法,上面的写法叫做非括号语法,还有一种写法叫做括号语法,如下:

namespace MyProject1 {......
}

这两种写法,在同一个文件中不能混用。

推荐还是使用非括号语法,而且一个文件只用一个namespace。

括号语法的一个不同之处在于,可以显式声明一个全局命名空间,比如:

namespace {......
}

不加命名空间名字,就是全局命名空间。

在同一个文件里使用资源

首先,在同一个文件里,可以有多个namespace(这一点和Java不一样),比如:

namespace MyProject1\Namespace1;......namespace MyProject2\Namespace2;......

或者:

namespace MyProject1\Namespace1 {......
}namespace MyProject2\Namespace2 {......
}

限定,完全限定,非限定

在使用另一个命名空间的资源时,可用下面三种方式:

  • 限定:有点类似于“相对路径”,但貌似只能向下,不能向上(即找其父命名空间)
  • 完全限定:有点类似于“绝对路径”,安全可靠
  • 非限定:不指定namespace信息(使用当前命名空间的资源,或者全局资源,或者资源的别名)
限定
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject1;
echo Namespace1\PI;

本例中,在 MyProject1 下,要使用 MyProject1\Namespace1 下的资源,可以直接从当前命名空间开始计算,因此只需指定 Namespace1 即可(开头不加 \ )。

完全限定
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
echo \MyProject1\Namespace1\PI;

不管在哪里,要使用 MyProject1\Namespace1 下的资源,都可以从根命名空间开始计算,也就是以 \ 开头,指定全路径 \MyProject1\Namespace1

非限定
namespace {const E = 2.72;
}namespace MyProject1 {echo E;// echo \E;
}

本例中,因为要使用的是全局命名空间的资源,所以无需指定namespace。

当然,如果前面加上 \ ,显式指定全局资源,也是OK的。

事实上,如果使用全局资源,加上 \ 会更安全一些,这是因为如果不加 \ ,会先查找当前命名空间,然后才是全局命名空间。

namespace MyProject1\Namespace1;
const M_PI = 3.14;
echo M_PI . PHP_EOL;
echo \M_PI . PHP_EOL;

输出结果如下:

3.14
3.1415926535898

可见 M_PI\M_PI 是不同的,前者是当前命名空间的常量,后者是全局常量。

如果注释掉第二行代码,则 M_PI\M_PI 一样,都是指向全局常量。

use关键字

使用其它命名空间的资源时,每次都要指定命名空间结构,太麻烦了。为了方便,可使用 use 关键字来简化操作。

use 关键字有以下几种使用方法:

  • 指定命名空间
  • 指定资源
  • 指定命名空间,并给命名空间起个别名
  • 指定资源,并给资源起个别名
namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
use \MyProject1\Namespace1; // 指定命名空间
echo Namespace1\PI . PHP_EOL;namespace MyProject3\Namespace3;
use const \MyProject1\Namespace1\PI; // 指定资源
echo PI . PHP_EOL;namespace MyProject4\Namespace4;
use \MyProject1\Namespace1 as MyNamespace; // 指定命名空间,并给命名空间起个别名
echo MyNamespace\PI . PHP_EOL;namespace MyProject5\Namespace5;
use const \MyProject1\Namespace1\PI as MyPI; // 指定资源,并给资源起个别名
echo MyPI . PHP_EOL;

注意和Java的区别:Java的 import 指定的是资源(具体来说是类),比如 import java.util.* 或者 import java.util.ArrayList 。而PHP的 use 既可以指定命名空间,也可以指定资源。

PHP在use命名空间时,如果没有起别名,则接下来使用命名空间的最后一部分(如上例中的 Namespace1 )来简化命名空间全称,如果有别名,则使用别名来简化命名空间全称。

同理,PHP在use资源时,如果没有起别名,则接下来使用资源名(如上例中的 PI )来简化其全限定名,如果有别名,则使用别名来简化其全限定名。

此外要注意,PHP在use资源时,如果是常量,则需显式指定 const (见上例)。类似的,如果是use一个方法,则需显式指定 function

起别名的一个重要意义在于,如果引入多个相同非限定名的命名空间或者是引入同名资源,则需要通过别名来避免冲突。比如:

namespace MyProject1\Controller;
const E = 2.71;namespace MyProject2\Controller;
const E = 2.71828;namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject2\Namespace2;
const PI = 3.14159;namespace MyProject3\Namespace3;
use \MyProject1\Controller as Controller1; // Controller有歧义,需用别名避免冲突
echo Controller1\E . PHP_EOL;use \MyProject2\Controller as Controller2; // Controller有歧义,需用别名避免冲突
echo Controller2\E . PHP_EOL;use const \MyProject1\Namespace1\PI as PI1; // PI有歧义,需用别名避免冲突
echo PI1 . PHP_EOL;use const \MyProject2\Namespace2\PI as PI2; // PI有歧义,需用别名避免冲突
echo PI2 . PHP_EOL;

use VS 直接指定资源

前面提到,直接指定资源限定名时:

  • \ 开头:完全限定,从根命名空间开始计算
  • 不以 \ 开头,非完全限定,从当前命名空间开始计算

在使用 use 关键字指定命名空间或资源时,无论是否以 \ 开头,都是完全限定的。也就是说,一定是从根命名空间开始计算的。

namespace MyProject1\Namespace1;
const PI = 3.14;namespace MyProject1;
echo Namespace1\PI . PHP_EOL; // 直接指定,不以 \ 开头,非完全限定,从当前命名空间开始计算echo \MyProject1\Namespace1\PI . PHP_EOL; // 直接指定,以 \ 开头,完全限定,从根命名空间开始计算use const MyProject1\Namespace1\PI as MyPI1; // 使用use, 不以 \ 开头,完全限定,从根命名空间开始计算
echo MyPI1 . PHP_EOL;use const \MyProject1\Namespace1\PI as MyPI2; // 使用use, 以 \ 开头,完全限定,从根命名空间开始计算
echo MyPI2 . PHP_EOL;

注:这种行为可能与PHP版本有关,我使用的PHP 8,也许旧版本不是这样的,我没有深究。

在不同的文件里使用

资源和使用者如果在不同的文件里,则使用者需要先引入资源所在的文件。在PHP里,是使用 include 或者 require 关键字来引入文件,具体参见我另一篇文档( https://blog.csdn.net/duke_ding2/article/details/147690887 )。

但是,由于PHP的命名空间和实际目录结构是相互独立的,因此,引入文件后,仍需通过命名空间来指定资源。

  • test0602_1.php
namespace MyProject1\Namespace1;const PI = 3.14;
  • test0602_2.php
namespace MyProject2\Namespace2;require 'test0602_1.php';echo \MyProject1\Namespace1\PI;

同样,也可使用 use 关键字来简化操作。

test0602_2.php 改写如下:

namespace MyProject2\Namespace2;require 'test0602_1.php';use const \MyProject1\Namespace1\PI;echo PI;

注意和Java对比:

  • Java只需 import (既指定目录结构也指定包结构),PHP需要 requireuse (前者指定目录结构,后者指定命名空间结构)
  • Java不用 import 也行,只需指定资源全称。PHP可以不用 use ,只需指定资源或命名空间全称,但是 require 是避免不了的(除非通过自动加载机制隐式加载),因为文件路径和资源全称是相互独立的

总结

  • 使用 namespace 关键字来声明命名空间,各级之间以 \ 分隔
  • 有“括号语法”和“非括号语法”两种写法,一般使用非括号语法,且一个文件只用一个namespace
  • 使用者可以通过“限定”、“完全限定”、“非限定”的方式来指定使用的命名空间
  • 命名空间结构和实际文件目录结构可以不一致,但推荐保持一致
  • 通过 use 关键字来引入命名空间或者资源,简化使用
  • 使用 use 指定的命名空间或资源,不管是否以 \ 开头,实际都是从根命名空间开始计算的(至少PHP8是这样)

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

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

相关文章

矩阵分解相关知识点总结(二)

文章目录 三、矩阵的QR分解3.1、Givens矩阵与Givens变换3.2、Householder矩阵与Householder变换3.3、QR分解 书接上文矩阵分解相关知识点总结&#xff08;一&#xff09; 三、矩阵的QR分解 3.1、Givens矩阵与Givens变换 设非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及单…

Chorme如何对于youtube视频进行画中画背景播放?

画中画可以让你小窗播放&#xff0c;然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放&#xff0c;游览器最小化就可以&#xff0c;但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…

14.AI搭建preparationのBERT预训练模型进行文本分类

一、回顾&#xff1a; 对深度学习框架Python2.0进行自然语言处理有了一个基础性的认识注意力模型编码器(encoder_layer,用于分类的全连接层dense_layer)&#xff0c;抛弃了传统的循环神经网络和卷积神经网络&#xff0c;通过注意力模型将任意位置的两个单词的距离转换成1编码器…

OD 算法题 B卷【最长公共前缀】

文章目录 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组 中的最长公共前缀&#xff0c;如果不存在公共前缀&#xff0c;返回字符串’Zero’字符串长度范围【2,1000】&#xff0c;字符串中字符长度范围为【1,126】 示例1 输入&#xff1a; [“flower”, “flow”, …

pycharm F2 修改文件名 修改快捷键

菜单&#xff1a;File-> Setting&#xff0c; Keymap中搜索 Rename&#xff0c; 其中&#xff0c;有 Refactor-> Rename&#xff0c;右键添加快捷键&#xff0c;F2&#xff0c;删除原有快捷键就可以了。

WEB安全--SQL注入--bypass技巧2

继之前文章的补充&#xff1a; WEB安全--SQL注入--bypass技巧_sql注入过滤空格-CSDN博客 Q1&#xff1a;发现sql注入的时间盲注时&#xff0c;如果时间盲注的函数都被过滤了&#xff0c;怎么办&#xff1f; 除了找其他函数替换、编码等方式&#xff0c;还有以下方式绕过&…

自定义事件wpf

// 自定义控件 public class MyCustomControl : Control { public static readonly RoutedEvent MyCustomEvent EventManager.RegisterRoutedEvent( "MyCustom", RoutingStrategy.Bubbling, typeof(RoutedEventHandler), typeof(MyCustomControl) ); public event R…

【汇编逆向系列】一、无参数的函数调用- RSP,EAX寄存器,全局变量,INT类型和MOV,INC,SHL指令

给出一段简单的汇编 no_params_function:0000000000000000: 40 57 push rdi0000000000000002: 8B 05 00 00 00 00 mov eax,dword ptr [global_counter]0000000000000008: FF C0 inc eax000000000000000A: 89 05 00 00 00 0…

知识蒸馏:从模型输出到深层理解

1. 概念阐释: 还记得上次说的“老师教你画画,不只教‘猫’,还教‘像狗像树叶’的细微感觉”吗?那是最初的蒸馏。 后来大家发现,老师不仅仅通过“最后画出来像什么”来教你。 有时候,老师是教你“他画画时,哪里用了力气,哪里画得特别认真”(这叫基于特征的蒸馏,学习…

vue-18(使用 Vuex 插件实现高级功能)

使用 Vuex 插件实现高级功能 Vuex 插件提供了一种强大的方式来扩展 Vuex 存储的功能。它们为存储的变更过程提供了钩子&#xff0c;允许你拦截变更、执行副作用以及添加自定义逻辑。本章将探讨如何利用 Vuex 插件实现持久化、日志记录和时间旅行调试等高级功能。我们将深入研究…

【Java】CopyOnWriteArrayList

一&#xff0c;概述 CopyOnWriteArrayList作为List接口的实现之一&#xff0c;它区分于ArrayList在于它是线程安全的。如它名字一样&#xff0c;所有的写操作均复制了原数组的值&#xff0c;虽说代价较大&#xff0c;但读多写少的环境下&#xff0c;是可接受的。笔者在此简单看…

【高等数学】函数项级数

目录 函数项级数收敛域的定义收敛域的判定方法常见幂级数展开&#xff08;麦克劳林级数&#xff09;幂级数的应用 傅里叶级数傅里叶级数的基本概念傅里叶级数的主要性质奇偶函数的简化周期延拓奇延拓偶延拓 函数项级数 函数项级数是指由一系列函数构成的无穷级数&#xff0c;形…

基于cornerstone3D的dicom影像浏览器 第二十八章 LabelTool文字标记,L标记,R标记及标记样式设置

文章目录 前言一、L标记、R标记二、修改工具样式1. 样式的四种级别2. 导入annotation3. 示例1 - 修改toolGroup中的样式4. 示例2 - 修改viewport中的样式 三、可配置样式 前言 cornerstone3D 中的文字标记工具LabelTool&#xff0c;在添加文字标记时会弹出对话框让用户输入文字…

PPT转图片拼贴工具 v4.3

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 效果展示 支持导入文件和支持导入文件夹&#xff0c;也支持手动输入文件/文件夹路径 软件界面 这一次提供了源码和开箱即用版本&#xff0c;exe就是直接用就可以了。 软件源码 import os import re import sys …

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…

神经网络-Day45

目录 一、tensorboard的基本操作1.1 发展历史1.2 tensorboard的原理 二、tensorboard实战2.1 cifar-10 MLP实战2.2 cifar-10 CNN实战 在神经网络训练中&#xff0c;为了帮助理解&#xff0c;借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&…

设计模式之单例模式(二): 心得体会

设计模式之单例模式(一)-CSDN博客 目录 1.背景 2.分析 2.1.违背面向对象设计原则&#xff0c;导致职责混乱 2.2.全局状态泛滥&#xff0c;引发依赖与耦合灾难 2.3.多线程场景下风险放大&#xff0c;性能与稳定性受损 2.4.测试与维护难度指数级上升 2.5.违背 “最小知识原…

windows10 php报错

参考这个&#xff0c; 实际解决了问题&#xff0c; 主要是repair c 然后重启 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU显存的作用和如何选择

核心定义与作用 首先&#xff0c;显存的全称是显示内存&#xff0c;英文是Video RAM或VRAM&#xff0c;是显卡上的专用内存。 显存的主要作用是用来存储图形处理单元&#xff08;GPU&#xff09;需要处理的数据&#xff0c;比如纹理、顶点数据、帧缓冲区等。 数据中转站 GPU…

从零开始:用Tkinter打造你的第一个Python桌面应用

目录 一、界面搭建:像搭积木一样组合控件 二、菜单系统:给应用装上“控制中枢” 三、事件驱动:让界面“活”起来 四、进阶技巧:打造专业级体验 五、部署发布:让作品触手可及 六、学习路径建议 在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速…