「PHP系列」PHP 命名空间详解

文章目录

  • 一、PHP命名空间
    • 1. 声明命名空间
    • 2. 使用命名空间
    • 3. 命名空间的作用范围
    • 4. 子命名空间
    • 5. 全局命名空间和非命名空间代码
    • 6. 命名空间与自动加载
  • 二、PHP命名空间使用
    • 1. 基本使用
    • 2. 子命名空间
    • 3. 全局函数和常量
    • 4. 结合自动加载
  • 三、相关链接

一、PHP命名空间

PHP 的命名空间(Namespace)是 PHP 5.3.0 版本之后引入的一个功能,用于解决类名冲突的问题,并更好地组织代码。通过使用命名空间,你可以将相关的类、接口、函数和常量组合在一起,形成一个逻辑上的代码单元,从而避免不同库或框架中的类名冲突。

1. 声明命名空间

你可以使用 namespace 关键字来声明一个命名空间。例如:

namespace MyProject;class MyClass {// ...
}

在这个例子中,MyClass 类位于 MyProject 命名空间中。

2. 使用命名空间

要访问一个命名空间中的类、函数或常量,你可以使用以下三种方式之一:

  1. 完全限定名(Fully Qualified Name):使用完整的命名空间路径来引用一个元素。例如:
$obj = new \MyProject\MyClass();
  1. 导入(Import):使用 use 关键字导入命名空间或类,然后可以使用简短的名称来引用它们。例如:
use MyProject\MyClass;$obj = new MyClass();
  1. 别名(Alias):当导入命名空间或类时,你可以为其指定一个别名,以避免名称冲突或简化代码。例如:
use MyProject\MyClass as MyC;$obj = new MyC();

3. 命名空间的作用范围

命名空间的作用范围从定义命名空间的声明开始,到包含命名空间的文件结束。在同一个文件中,你可以定义多个命名空间,但每个命名空间必须单独声明。

4. 子命名空间

你可以在命名空间中定义子命名空间,以进一步组织代码。例如:

namespace MyProject\SubNamespace;class MySubClass {// ...
}

在这个例子中,MySubClass 类位于 MyProject\SubNamespace 命名空间中。

5. 全局命名空间和非命名空间代码

如果你没有为代码指定命名空间,那么它位于全局命名空间中。在全局命名空间中定义的函数和常量在任何地方都可以访问,而无需使用命名空间前缀。但是,全局命名空间中的类在使用时需要加上全局命名空间前缀(即反斜杠 \)。

6. 命名空间与自动加载

结合 PHP 的自动加载机制,命名空间可以帮助你更好地组织和管理代码库。通过使用命名空间和自动加载器,你可以轻松地加载和实例化任何命名空间中的类,而无需手动包含或引入文件。

二、PHP命名空间使用

在 PHP 中,命名空间提供了一种封装类、接口、函数和常量的方式,以避免名称冲突,并更好地组织代码。下面是一些关于如何使用 PHP 命名空间的案例和说明。

1. 基本使用

假设你有两个项目,它们都有一个名为 User 的类。为了避免类名冲突,你可以为每个项目使用不同的命名空间。

项目 A:

// 文件路径: projectA/User.php
namespace ProjectA;class User {public function sayHello() {echo "Hello from Project A!";}
}

项目 B:

// 文件路径: projectB/User.php
namespace ProjectB;class User {public function sayHello() {echo "Hello from Project B!";}
}

现在,你可以在另一个文件中使用这两个类,而不会发生冲突:

// 使用 ProjectA 的 User 类
use ProjectA\User as ProjectAUser;$userA = new ProjectAUser();
$userA->sayHello(); // 输出 "Hello from Project A!"// 使用 ProjectB 的 User 类
use ProjectB\User as ProjectBUser;$userB = new ProjectBUser();
$userB->sayHello(); // 输出 "Hello from Project B!"

2. 子命名空间

你可以在命名空间中定义子命名空间来进一步组织代码。

// 文件路径: MyApp/Database/Connection.php
namespace MyApp\Database;class Connection {// ... 数据库连接逻辑 ...
}// 文件路径: MyApp/Database/Query.php
namespace MyApp\Database;class Query {// ... 数据库查询逻辑 ...
}

在另一个文件中,你可以这样使用这些类:

use MyApp\Database\Connection;
use MyApp\Database\Query;$connection = new Connection();
$query = new Query();
// ... 使用 $connection 和 $query 进行数据库操作 ...

3. 全局函数和常量

在全局命名空间中定义的函数和常量不需要使用命名空间前缀即可访问。但是,在命名空间中定义的函数和常量需要使用完整的命名空间路径来访问。

// 文件路径: functions.php
function globalFunction() {echo "This is a global function.";
}define('GLOBAL_CONSTANT', 'This is a global constant.');// 文件路径: MyClass.php
namespace MyNamespace;function namespacedFunction() {echo "This is a namespaced function.";
}const NAMESPACED_CONSTANT = 'This is a namespaced constant.';// 在另一个文件中使用这些函数和常量
require_once 'functions.php';
require_once 'MyClass.php';globalFunction(); // 输出 "This is a global function."
echo GLOBAL_CONSTANT; // 输出 "This is a global constant."\MyNamespace\namespacedFunction(); // 输出 "This is a namespaced function."
echo \MyNamespace\NAMESPACED_CONSTANT; // 输出 "This is a namespaced constant."

4. 结合自动加载

命名空间通常与 PHP 的自动加载机制结合使用,以便在需要时自动包含类文件。这通常通过实现一个自动加载函数来完成,该函数根据类名查找对应的文件。

spl_autoload_register(function ($className) {$className = ltrim($className, '\\'); // 去除类名开头的反斜杠$fileName  = __DIR__ . '/' . str_replace('\\', '/', $className) . '.php';if (file_exists($fileName)) {require $fileName;}
});// 现在,当你尝试实例化一个类时,如果该类尚未被包含,自动加载函数将尝试找到并包含它
$obj = new \MyApp\Database\Connection(); // 如果 Connection 类存在,它将被自动加载

三、相关链接

  1. php官网
  2. php_Github
  3. PHP实现Token
  4. 「PHP系列」PHP简介与起步
  5. 「PHP系列」PHP语法介绍
  6. 「PHP系列」PHP变量
  7. 「PHP系列」PHP echo/print语句、数据类型详解
  8. 「PHP系列」PHP 常量/字符串、类型比较
  9. 「PHP系列」PHP 运算符详解
  10. 「PHP系列」If…Else语句/switch语句
  11. 「PHP系列」数组详解
  12. 「PHP系列」PHP数组排序及运用场景

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

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

相关文章

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境,并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店,在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS:Clang这个插件别安装&…

【电路笔记】-逻辑或非门

逻辑或非门 文章目录 逻辑或非门1、概述2、晶体管逻辑或非门3、数字逻辑或非门类型4、通用或非门逻辑或非门是数字逻辑或门与反相器或非门串联的组合。 1、概述 或非(Not-OR)门的输出通常为逻辑电平“1”,并且仅当其任何输入处于逻辑电平“1”时才变为“低”至逻辑电平“0”…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR(Harmony Archive)是静态共享包,可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP,不能独立安装运行在设备上,只能作为应用模块…

力扣HOT100 - 73. 矩阵置零

解题思路: 题目要求使用原地算法 在原地算法中,输入数据通常在内存中直接被修改,而不需要额外的辅助数据结构来存储中间结果。原地算法的一个常见应用是在数组或列表上进行操作,而不是创建新的数组或列表来存储结果。 class So…

bash的login shell与non-login shell,以及各自的初始化过程

识别login shell与non-login shell login shell 可能是以-开头的 [almalinuxVM-AlmaLinux8-tmpl-wanlinwang ~]$ echo $0 -bash # "-" is the first character. Therefore, this is a login shell.或者以--login启动的bash [almalinuxVM-AlmaLinux8-tmpl-wanlinw…

Python自动打开Excel文件

导入必要的模块 import os import subprocess编写打开文件的函数 def open_file(file_path):"""打开指定路径下的文件。参数:file_path (str): 文件的路径。"""if os.name "nt": # 如果是 Windows 系统os.startfile(fi…

js面试---数据类型

1、js有哪些数据类型?有什么区别 js一共有Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt,八种数据类型。 Symbol:ES6新增数据类型,代表创建后独一无二且不可变的数据类型,主要是为了解决可能出现…

【截至2023年底】语言模型的发展

什么是大语言模型LLM?ChatGPT、LLAMA各自有什么优势? from: https://www.youtube.com/watch?vt6qBKPubEEo github: https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey,但据说还在更新,到…

数据结构——线性表(顺序存储结构)

语言:C语言软件:Visual Studio 2022笔记书籍:数据结构——用C语言描述如有错误,感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列,对n>0,除第一元素无直接…

设置MariaDB,创建新库,新用户并授权其可以从任何主机登录

OS:CENTOS 7 1、从系统进入MariaDB # mysql -u root -p 这里的root是指MariaDB的管理员用户,和系统的root不搭边,只是同名而已。 2、看下有哪些库、用户 MariaDB [(none)]> show databases; MariaDB [(none)]>select user,host from mysql.us…

MySQL:关于数据库的一些练习题

文章目录 前面的内容已经把数据库的一些必要知识已经储备好了,因此下面就对于这些语句进行一些练习: 批量插入数据 insert into actor values (1, PENELOPE, GUINESS, 2006-02-15 12:34:33), (2, NICK, WAHLBERG, 2006-02-15 12:34:33);SQL202 找出所有…

学习R语言第二天

R语言可以做什么 1.数据分析 R语言如何使用 1. 请看我的操作方式 2. 如何获取当前路径 -- 获取当前路径 > getwd() [1] "E:/R/RWorkSpace/day01" -- 修改当前路径 > setwd(dir "E:/R") > getwd() [1] "E:/R" 3.查看当下数据值的信…

java的this关键字 and 构造器

文章目录 构造器构造器的特点this关键字举个例子吧其他链接 不难理解,so easy!!! 构造器 People people new People(); // People类型:决定着对象的类型(在内存中的构造形式) // people对象名称,在栈内存当中 // new…

UT单元测试

Tips:在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的,模拟的,虚假的。对于测试框架来说,即构造出一个模拟/虚假的对象,使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…

Android 允许其他应用读取本应用的私有目录

在Android中,应用默认是封闭的,不允许其他应用访问自己的私有目录。但是,如果你想要让其他应用能够访问你的应用中的某些文件,你可以使用FileProvider类来实现这一功能。 以下是使用FileProvider的步骤: 1. 在你的应…

SAP Fiori开发中的JavaScript基础知识12 - 闭包,模块模式,回调函数

1. 前言 本文将介绍JavaScript中几个高阶的知识点:闭包,模块和回调。 2. 闭包 在JavaScript中,闭包是一个非常强大的特性,它允许函数记住并访问它的词法作用域,即使它在词法作用域之外执行。 简单来说,…

【CVE-2023-38831】进行钓鱼攻击的研究

本文仅仅是对相关漏洞利用的学习记录,请各位合法合规食用! WinRAR是一款文件压缩器,该产品支持RAR、ZIP等格式文件的压缩和解压等。WinRAR在处理压缩包内同名的文件与文件夹时代码执行漏洞,攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受…

C# wpf 嵌入外部程序

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序(本章) 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、定义属性2、进程嵌入(1&…

AugmentedReality之路-平面检测(5)

本文介绍通过AR检测水平平面和垂直平面,并将检测到的平面转化为Mesh 1、在首页添加功能入口 在首页添加一个按钮,命名为Start World Track 2、自定义ExecStartAREvent 创建ARSessionConfig并取名为ARSessionConfig_World 自定义ExecStartAREvent&…

大话设计模式之迭代器模式

迭代器模式是一种行为设计模式,它允许客户端逐个访问集合中的元素,而不暴露集合的底层表示。这种模式提供了一种方法来访问聚合对象中的各个元素,而不需要暴露其内部结构。 迭代器模式由以下几个关键角色组成: 迭代器&#xff08…