【web开发】PHP命名空间中的子空间和公共空间详解及相关术语解读
前言
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自带的元素,都属于公共空间。其实公共空间的函数和常量不用加“\”也可以正常调用,但是为了正确区分元素所在的区域,还是建议调用函数时加上“\”。
- 点赞
- 收藏
- 关注作者
评论(0)