【web开发】PHP命名空间中的子空间和公共空间详解及相关术语解读

举报
迷彩 发表于 2023/07/27 13:26:06 2023/07/27
【摘要】 前言PHP的命名空间和文件系统的结构很像,文件夹可以有子文件夹,命名空间中也可以定义子空间来描述各个空间之间的所属关系。比如:cart购物车和order订单这两个模块都处于同一个shop商城项目内,通过命名空间子空间表达关系的:<?phpnamespace shop\cart;class Demo{ //类的成员}namespace shop\order;class Demo{ //类的成员...

前言

PHP的命名空间和文件系统的结构很像,文件夹可以有子文件夹,命名空间中也可以定义子空间来描述各个空间之间的所属关系。比如:cart购物车和order订单这两个模块都处于同一个shop商城项目内,通过命名空间子空间表达关系的:

<?php
namespace shop\cart;
class Demo{
	//类的成员
}

namespace shop\order;
class Demo{
	//类的成员
}


$demo = new Demo(); //当前空间
$cart = new \shop\cart\Demo();//调用shop\cart空间的Demo类;

命名空间的子空间还可以定义很多层次,比如:“com/web/www/shop”类似于Java中package。多层子空间的声明通常使用公司域名的倒置,再加上项目名称组合而成。学过Java的童鞋仔细一看是不是跟Java中的包简直一毛一样。这样做的好处是域名在互联网上是不重复的,不会出现和网上同名的命名空间,还可以辨别出具体是哪家公司的项目,有很强的广告性和可辨别性。

命名空间中的名称和术语

既然上面我们说到了多层子空间的声明的命名方式,接着我们就详细了解下和命名空间有关的术语。非限定名称,限定名称和完全限定名称是使用命名空间的三个术语,了解他们对深入学习PHP命名空间以及其他进阶技术知识有很大的帮助。不仅仅是弄懂概念,更要掌握PHP是怎样解析的。三个名称和术语具体解析如下:

非限定名称:不包含前缀的类名称。​​如:$user = new User();​

如果当前命名空间是com\admin,User将被解析为com\admin\User.如果使用User的代码在公共空间中则User会被解析为User

限定名称:包含前缀的名称。​​如:$user = new admin\User();​

如果当前命名空间是com,则User会被解析为com\admin\User.如果使用User的代码在公共空间中在User会被解析为User

完全限定名称:包含了全局前缀操作符的名称。​​如:$user = new \admin\User();​

这种使用方式,User总是会被解析为admin\User

所以一定要注意在当前命名空间和公共命名空间使用的区别,其实可以把这三种名称类比为文件名:例如:user.php、相对路径名:如./admin/user.php、绝对路径名:如:/com/admin/user.php。这样是不是会更容易理解一点呢。

<?php
namespace com;
class User{
	//类的成员
	//
}

$com_user =  new User(); //非限定名称:表示当前com空间将被解析为com\User()
$admin_user =  new admin\User(); //限定名称:表示相当于com空间,没有反斜杠\.将被解析为com\admin\User()
$admin_user =  new \com\User(); //完全限定名称表示绝对于com空间,有反斜杠\,将被解析为com\User()
$admin_user =  new \com\admin\User();//完全限定名称表示绝对于com空间,有反斜杠\,将被解析为com\admin\User()

namespace com\admin;
class User{
	function run(){}
}

其实我们前面文章所用到的都是非限定名称和完全限定名称,只是我们没有去纠结其中的叫法。了解术语一个很大的用处就在于,方便大家技术的沟通,避免理解上产生歧义,避免不必要的麻烦。

多层次的命名空间如何声明?

命名空间的公共空间很容易理解,其实没有定义命名空间的方法,类库和常量都默认归属于公共空间,这样就解释了在以前的版本上编写的代码大部分都可以在PHP5.3以后的版本中去运行。此外,公共空间中的代码段被引入到某个命名空间下以后,该公共空间中的代码段不属于任何命名空间。比如:声明一个脚本文件common.php,在文件中声明的函数和类再创建一个PHP文件,并在一个命名空间里引入这个脚本文件common.php,此脚本这里的类和函数并不会归属到这个命名空间。注:如果这个脚本里没有定义其他命名空间,它的元素就始终处于公共空间中。

1.创建一个common.php

<?php
function func(){//todo}
class Demo{
	//类的成员
  //todo..
}
<?php
namespace com\admin;
include './common.php';
class User{
	function run(){}
}

$test = new Demo(); //出现致命错误:找不到com\admin\Demo类,默认会在本空间中查找
$test = new \Demo();//调用公共空间的方式是直接在元素名称前加反斜杠\即可

var_dump();//系统函数都在公共空间
\var_dump(); //正确用法

执行结果:

调用公共空间的方式是直接在元素名称前加上“\”即可,否则PHP解析器会认为用户想调用当前空间下的元素。除了自定义的元素外,还包括PHP自带的元素,都属于公共空间。其实公共空间的函数和常量不用加“\”也可以正常调用,但是为了正确区分元素所在的区域,还是建议调用函数时加上“\”。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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