IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP & 理解 Namespace (命名空间) -> 正文阅读

[PHP知识库]PHP & 理解 Namespace (命名空间)

前言

假设我们有 Tools/A/Foo.php 、Tools/B/Foo.php 文件,这两个 Foo.php 定义了同一个类,然后从 C.php 引入这两个文件,大家说会出现什么情况?代码如下

# Tools/A/Foo.php
class Foo{
	public function __construct() {}
	public function say() {
		echo "Hello,world";
	}
}
# Tools/B/Foo.php
class Foo{
	public function __construct() {}
	public function say() {
		echo "Hello, Tony";
 	}
}
# C.php
include_once "Tools/A/Foo.php";
include_once "Tools/B/Foo.php";
$foo = new Foo();
$foo->say();

你会看到报如下错误:
Fatal error: Cannot declare class Foo, because the name is already in use

该错误表示 Foo 已经重复声明过了,解决方式也很简单,我们拼接独立的前缀不就行了,so 我们来调整一下结构

# Tools/A/Foo.php
class A_Foo{ # 将 Foo 改为 A_Foo
	// 代码不变
}
# Tools/B/Foo.php
class B_Foo{ # 将 Foo 改为 B_Foo
	// 代码不变
}
# C.php
include_once "Tools/A/Foo.php";
include_once "Tools/B/Foo.php";
$a = new A_Foo();
$a->say(); // Hello,world
$b = new B_Foo();
$b->say(); // Hello,Tony

看似问题是解决了,但还面临着其它情况

  1. 引入第三方插件时,名字也可能冲突
  2. 若目录嵌套过深,独立前缀加长,使用时也要跟着加长,可读性差
  3. 团队开发各个成员也容易遇到出现命名重复问题

就算能解决以上这3个问题,每个人的处理方式终究不一样,只会让维护性更差。
说到底还是缺少一种规范,这不 PHP 就新出了 namespace 命名空间这玩意,大家都只要按照它的语法来写问题就迎刃而解。

namespace

好处

  1. 解决命名重复问题
  2. 统一规范,各个文件类名依然可以保留,不再需要单独写 _ 下划线进行兼容。

用法

假设我们的目录结构如下

Tools
	A
		Foo.php
	B
		Foo.php
C.php
# Tools/A/Foo.php
namespace Tools\A; # 新增
class Foo{
	// 内容不变
}
# Tools/B/Foo.php
namespace Tools\B; # 新增
class Foo{
	// 内容不变
}

# C.php
include_once "Tools/A/Foo.php";
include_once "Tools/B/Foo.php";
$a = new Tools\A\Foo();
$a->say(); // Hello,world

$b = new Tools\B\Foo();
$b->say();// Hello,Tony

我们可以看到,两个文件的类名依然一样,只需 new 时带上 namespace 定义的前缀即可,可能有的小伙伴就疑惑了?这种写法不是跟 _ 下划线差不多吗?
注意:还是有差别的,各自文件的类名 Foo 依然保持一致不是吗?
可能你觉得总差点东西,对,名字过长的问题怎么解决? 别急,这不还有另外一个语法 use,我们来改动一下 C.php 代码

# C.php
include_once "Tools/A/Foo.php";
include_once "Tools/B/Foo.php";
use Tools\A\Foo as Foo1;
use Tools\B\Foo as Foo2;
$a = new Foo1();
$a->say(); // Hello,world

$b = new Foo2();
$b->say();// Hello,Tony

现在既保持源类名相同,又能通过 use 方式来简化语法,问题迎刃而解。
对于 PHP 开发者来说掌握 namespace 语法是必须不可缺的。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 22:53:19  更:2022-01-29 22:53:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:39:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码