【web开发】PHP的命名空间简单应用

举报
迷彩 发表于 2023/07/27 13:24:35 2023/07/27
【摘要】 前言学习过各种编程语言的童鞋,一定对命名空间这个概念并不陌生。PHP中的命名空间也不是一开始就有,而是在PHP5.3之后才增加命名空间这个特性,那为什么需要引入命名空间这个概念呢 ,或者说引入命名空间能解决什么问题?下面我们详细介绍,然后通过简单的实例感受命名空间的神奇之处。PHP中声明的函数名,类名以及常量名称,在同一次运行中是不能重复的,也就是不能出现重名,因为名称作为标识符在一次运行的...

前言

学习过各种编程语言的童鞋,一定对命名空间这个概念并不陌生。PHP中的命名空间也不是一开始就有,而是在PHP5.3之后才增加命名空间这个特性,那为什么需要引入命名空间这个概念呢 ,或者说引入命名空间能解决什么问题?下面我们详细介绍,然后通过简单的实例感受命名空间的神奇之处。

PHP中声明的函数名,类名以及常量名称,在同一次运行中是不能重复的,也就是不能出现重名,因为名称作为标识符在一次运行的空间中是唯一的,否则会产生一个致命的错误,常见的解决方法是约定一个前缀。比如:在项目开发时,用户(user)模块中的控制器和数据模型都声明为同名的User类是不行的,需要在类名前面加上各自的功能前缀或者后缀作为区分。可以将在控制器的User类命名为ActionUser或者UserController类,在数据模型中的User类命名为ModelUser类。很多像thinkphp,laravel,yii等PHP框架都是这么做的,还有很多PHP框架基本约定使用这种方式。虽然这种方式能够解决这个问题,但是名字会变得很长,这就意味着开发时编写更多的代码。在PHP5.3之后的版本中,包括现在最新的PHP8.2都增加了他高级语言如java,C#等使用很成熟的功能:命名空间,它的一个最明确的目的就是解决重名问题.命名空间将代码划分出不同的区域,每个区域的常量,函数以及类的名称互不影响

命名空间的作用

命名空间的作用和功能都很强大,在写插件或者通用库的时候再也不担心重名的问题.不过如果项目进行到一定程度,要通过增加命名空间去解决重名的问题,工作量不会比重构名称少.所以,从项目一开始的时候就应该很好地规划它,并制定一个命名规范,在实际的开发中一定会起到事半功倍的效果,特别是在团队开发中,拥有统一的开发规范,大大降低了沟通成本.在实际的开发一定要养成好习惯,一定要做好规划制定好开发规范.

命名空间的应用

默认情况下所有的PHP中的常量,类和函数的声明都放在全局空间下.php5.3以后的版本有独自的命名空间声明,不同空间中相同命名是不会出现冲突的.独立的命名空间使用namespace关键字声明,不过这个在PHP中不是强制的做法,你只有使用namespace关键字声明之后才会使用到命名空间这个功能.具体的声明方式如下:

<?php
namespace Myns;

//todo其他代码

namespace需要写在PHP脚本的顶部,必须是第一个PHP指令,基本就是第一行(declare除外).不要在namespace前面出现非PHP代码或者HTML代码或者空格

从代码"namespace Myns"开始到下一个"namespace"出现之前或者脚本运行结束是一个独立空间,将这个空间命名为Myns.如果你为相同的代码块嵌套命名空间或者定义多个命名空间是不可能的,如果有多个namespace一起使用,则只有最后一个命名空间才能被识别到.但是你可以在同一个文件中定义一个不同的命名空间代码:

<?php
namespace Myns1;

//todo其他代码
class User{
	//todo
	//成员属性
	//成员方法
}

namespace Myns2;

class User{
	 //todo
}

还有另一种写法:

<?php
namespace Myns3 {
	 //todo
}

上面的代码虽然可行,不同命名空间下使用各自的User类,但是建议为每个独立文件定义一个命名空间,这样代码可读性才是最好的.在相同的空间可以直接调用自己空间下的任何元素后者成员,而在不同的命名空间之间是不可以直接调用其他空间的元素的,需要使用命名空间的相关语法. 用法如下:

<?php
namespace Myns1;
const TEST = "这是一个常量<br>";
function test(){
	echo "这是一个方法<br>";
}
//todo其他代码
class User{
	//todo
	//成员属性
	//成员方法
	function run(){
		echo "这个是User类的成员方法run()<br>";
	}
}
echo TEST;
test();//调用test()方法

namespace Myns2;

const TEST2 = "这是一个常量<br>";
function test2(){
	echo "这是一个方法<br>";
}
echo TEST2;
\Myns1\test();//调用命名空间Myns1中的test()方法

$user = new \Myns1\User();//调用命名空间Myns1中User类中名为run()方法
$user->run();

执行结果如下:

如果你的命名空间写错就是这样的结果,比如这里的Myns1写成Myns:

总结

上面例子中声明了两个空间Myns1he1 Myns2,在自己的空间中可直接调用本空间中声明的元素,而在Myns2中调用Myns1中的元素时,使用了一种类似文件路径的语法 ​\命名空间\元素名​ 。对于类函数和常量的用法是一样的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。