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类)。
访问修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
缺省 | Y | Y | N | N |
private | Y | N | N | N |
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
后面不用加引号,但是 require
和 include
后面需要加引号,比如:
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需要require
和use
(前者指定目录结构,后者指定命名空间结构) - Java不用
import
也行,只需指定资源全称。PHP可以不用use
,只需指定资源或命名空间全称,但是require
是避免不了的(除非通过自动加载机制隐式加载),因为文件路径和资源全称是相互独立的
总结
- 使用
namespace
关键字来声明命名空间,各级之间以\
分隔 - 有“括号语法”和“非括号语法”两种写法,一般使用非括号语法,且一个文件只用一个namespace
- 使用者可以通过“限定”、“完全限定”、“非限定”的方式来指定使用的命名空间
- 命名空间结构和实际文件目录结构可以不一致,但推荐保持一致
- 通过
use
关键字来引入命名空间或者资源,简化使用 - 使用
use
指定的命名空间或资源,不管是否以\
开头,实际都是从根命名空间开始计算的(至少PHP8是这样)
相关文章:
PHP的namespace
文章目录 环境Java的packagepackage关键字包结构和目录结构访问权限import关键字总结 PHP的namespacenamespace关键字在同一个文件里使用资源限定,完全限定,非限定限定完全限定非限定 use关键字use VS 直接指定资源在不同的文件里使用总结 环境 Windows…...

《仿盒马》app开发技术分享-- 商品搜索页(顶部搜索bar热门搜索)(端云一体)
开发准备 随着开发功能的逐渐深入,我们的应用逐渐趋于完善,现在我们需要继续在首页给没有使用按钮以及组件添加对应的功能,这一节我们要实现的功能是商品搜索页面,这个页面我们从上到下开始实现功能,首先就是一个搜索…...
10_聚类
描述 聚类(clustering)是将数据集划分成组的任务,这些组叫作簇(cluster)。其目标是划分数据,使得一个簇内的数据点非常相似且不同簇内的数据点非常不同。与分类算法类似,聚类算法为每个数据点分…...
网络安全:网页密码防护与记住密码功能的安全
引言 在数字化时代,网页应用已成为人们生活和工作中不可或缺的一部分。用户登录作为网页应用的第一道防线,其密码防护机制至关重要。而 “记住密码” 功能虽然极大提升了用户体验,但也带来了诸多安全风险。从密码存储漏洞导致的数据泄露&…...

Tensorborad
一、tensorboard的基本操作 1.1 发展历史 TensorBoard 是 TensorFlow 生态中的官方可视化工具(也可无缝集成 PyTorch),用于实时监控训练过程、可视化模型结构、分析数据分布、对比实验结果等。它通过网页端交互界面,将枯燥的训练…...
Kafka存储机制核心优势剖析
文章目录 Kafka存储机制核心优势剖析1. **写入路径:Page Cache vs. 应用层缓存**2. **Page Cache工作原理解析**3. **顺序写盘 vs. 随机写盘**4. **资源利用最优化****为什么Page Cache方案更优?**1. **双缓存问题彻底解决**2. **读写路径统一优化**3. **故障恢复优势****生产…...
day027-Shell自动化编程-基础
文章目录 1. 修改vim配置文件自动添加注释2. 故障案例:Windows上写的Shell脚本上传到Linux系统上运行报错3. 脚本运行方法4. 变量4.1 普通变量4.2 环境变量4.3 特殊变量4.4 案例:书写ping检查脚本,检查脚本传入的第一个参数4.5 面试题&#x…...

工业自动化DeviceNET从站转Ethernet/IP主站网关赋能冶金行业工业机器人高效运行
在冶金行业高速发展的当下,对生产效率与精度的要求不断攀升。工业机器人凭借其精准、高效的特性,在钻孔、铣削、切割、弯曲、冲压等加工工艺中广泛应用。然而,不同设备间的通信协议差异常成为制约系统协同的瓶颈。JH-DVN-EIP疆鸿智能DeviceNE…...
STM32启动文件学习(startup_stm32f40xx.s)
原代码 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40xx.s ;* Author : MCD Application Team ;* version : V1.8.0 ;* date : 09-November-2016 ;* Desc…...
构建高效可靠的电商 API:设计原则与实践指南
引言 在数字化浪潮中,电商 API 接口技术已成为连接不同系统、实现数据高效流通的核心桥梁。通过标准化的协议和工具集合,API 不仅支撑了商品管理、订单处理等基础功能,还为个性化推荐、全球供应链协同等创新场景提供了底层支持。本文将结合行…...

开源数据库MySQL 与 PostgreSQL的巅峰对决。
MySQL 与 PostgreSQL 是两大主流开源关系型数据库,其核心差异主要体现在架构设计、功能特性、性能优化及适用场景上。结合最新技术对比和行业实践,以下为深度解析: 🧠 一、架构与设计哲学 维度PostgreSQL…...

从 LeetCode 到日志匹配:一行 Swift 实现规则识别
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在开发中我们经常遇到“模式匹配”的问题,比如日志分类、用户意图识别、甚至是在一些权限系统中做规则映射判断。这类问题的本质是判断两个结构是否具有一致的对应关系。LeetCo…...

前端js获取当前经纬度(H5/pc/mac/window都可用)
前端JS获取当前位置的经纬度(H5/PC/mac/window都可用,亲测!),效果如下。 完整代码如下: <!-- 用原生api获取经纬度,转化为百度经纬度与服务端交互, 只支持https! --&g…...

Meta计划借助AI实现广告创作全自动化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

AI编程规范失控?三大策略用Cursor Rules精准约束
在 AI 编程时代,如何让助手精准理解您的项目规范?当团队协作时,如何确保每位开发者生成的代码风格统一?Cursor Rules 正是您需要的终极解决方案——它如同一位永不疲倦的架构师,通过预设规则控制 AI 的每一次代码生成、重构与补全行为。 本教程将带您深入 Cursor Rules…...

4.大语言模型预备数学知识
大语言模型预备数学知识 复习一下在大语言模型中用到的矩阵和向量的运算,及概率统计和神经网络中常用概念。 矩阵的运算 矩阵 矩阵加减法 条件:行数列数相同的矩阵才能做矩阵加减法 数值与矩阵的乘除法 矩阵乘法 条件:矩阵A的列数 矩阵…...

免费开源Umi-OCR,离线使用,批量精准!
Umi-OCR(Windows端) Umi-OCR 是一款在 GitHub 上开源的免费 OCR 识别软件,它最大的亮点就是免费、开源、支持批量处理,而且识别准确度很高。这款软件不需要联网就能用,非常值得推荐! 在 OCR 识别功能方面&…...

NLP驱动网页数据分类与抽取实战
一、性能瓶颈点:数据抽取中的「三座大山」 在使用NLP技术进行网页商品数据抽取时,很多工程师会遇到如下三类瓶颈: 1. 请求延迟高:目标站点反爬机制灵敏,普通请求频繁被封。2. 结构解析慢:HTML结构复杂&am…...
设计模式之单例模式(二): 心得体会
设计模式之单例模式(一)-CSDN博客 目录 1.背景 2.分析 2.1.违背面向对象设计原则,导致职责混乱 2.2.全局状态泛滥,引发依赖与耦合灾难 2.3.多线程场景下风险放大,性能与稳定性受损 2.4.测试与维护难度指数级上升 2.5.违背 “最小知识原…...
使用Python提取PDF元数据的完整指南
PDF文档中包含着丰富的元数据信息,这些信息对文档管理和数据分析具有重要意义。本文将详细介绍如何利用Python高效提取PDF元数据,并对比主流技术方案的优劣。 ## 一、PDF元数据概述 PDF元数据(Metadata)是包含在文档中的结构化信…...
uni-app学习笔记十八--uni-app static目录简介
本笔记内容摘录自工程简介 | uni-app官网 一个 uni-app 工程,就是一个 Vue 项目,在完成uni-app项目创建后,会生成一个static目录, 为什么需要static这样的目录? uni-app编译器根据pages.json扫描需要编译的页面&…...

阿里云ACP云计算备考笔记 (3)——云存储RDS
目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…...

仓颉语言---Socket编程
一、什么是Socket编程? 1.定义 Socket(套接字)可以被理解为网络上两个进程之间通信的端点。它是网络通信的抽象表示,封装了底层网络协议的复杂性,为应用程序提供了一个简单统一的接口。 Socket 编程是一种网络编程范式…...
Mysql的B-树和B+树的区别总结
B 树也称 B- 树,全称为 多路平衡查找树,B 树是 B 树的一种变体。B 树和 B 树中的 B 是 Balanced(平衡)的意思。 目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 BTree 作为索引结构。 B 树& B 树两者有何异同呢&…...

【Java EE初阶 --- 多线程(初阶)】多线程的实现案例
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 前言单例模式实现单例模式…...

制作一款打飞机游戏64:关卡设计
今天我想完成第一个音乐循环的关卡设计。 初始设置 首先,我要删除所有之前创建的敌人和“大脑”(可能指敌人的行为模式或AI)。我不想保留它们,我要从零开始,重新创建敌人。但我会保留精灵(游戏中的角色或…...
开发常用的QT mql组件
Column Column 是一种将其子项沿单个列定位的类型。它是不使用锚点的情况下垂直定位一系列项目的便捷方式。 add : Transition bottomPadding : real leftPadding : real move : Transition padding : real populate : Transition rightPadding : real spacing : rea…...
Git操作记录
一.简单上传操作 1.Git 全局设置 git config --global user.name "xxx" git config --global user.email "xxx"2.创建新存储库 git clone gitgitlab.xxx.cn:xx/xxx/xxx.git cd test touch README.md git add README.md git commit -m "add README&qu…...
Vue Router的核心实现原理深度解析
1. Vue Router的基本架构 Vue Router的核心功能是实现前端路由,即在不重新加载页面的情况下更改应用的视图。它的基本架构包括: 路由配置:定义路径与组件的映射关系路由实例:管理路由状态和提供导航方法路由视图:渲染…...

Python趣学篇:用Pygame打造绚烂流星雨动画
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、项目简介与效果展示二、技术栈与核…...