前言
前面两篇文章我们详细介绍了PHP命名空间的定义和基本使用以及命名空间相关术语解读,对PHP的命名空间的有了更多的了解,本文我们再深入探索PHP命名空间的更多使用技巧。废话不多说,直接上菜。
命名空间的别名和导入
涉及到命名空间的使用,命名空间中的别名和导入这俩个概念我们是无法逃避的,学会灵活使用,能让我们更好地玩转PHP。
别名和导入可以看作是调用命名空间元素的一种快捷方式,允许通过别名引用或者导入外部的完全限定名称(有关于完全限定名称的相关概念我们上篇文章有具体介绍,可参考上一文章),是命名空间的一个重要特征。这就有点类似于在Linux文件系统中可以创建对其他文件或者目录的软连接。PHP命名空间支持两种使用别名或导入的方式:为类名称使用别名,或者为命名空间名称使用别名。注意:PHP不支持导入函数或者常量。在PHP中,别名是通过操作符use来实现的,接着我们通过具体的例子来了解相关的用法:
软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。简单来说,就是相当于windows里面的快捷方式。
<?php
namespace com\admin;
class User{
function run(){}
}
namespace shop;
use com\admin; //导入命名空间com\admin;
$comAdmin = new admin\User(); //导入命名空间之后可使用下限定调用相关元素
use com\admin as ca; //使用命名空间别名
$comAdmin = new ca\User(); //使用别名代替命名空间调用元素
use com\admin\User; //直接导入一个类
$comAdmin = new User(); //导入类,可直接使用非限定名称调用元素
use com\admin\User as caUser; //为类使用别名
$comAdmin = new caUser(); //直接通过别名调用类
最需要注意的一点是,如果在使用use进行导入的时候,当前空间有相同的名字的元素,由于发生冲突,将会发生致命错误。下面我们看看具体代码:
<?php
namespace com\admin;
class User{
function run(){}
}
namespace shop;
class User{
function run(){}
}
class CAUser{
function run(){}
}
<?php
namespace com\admin;
class User{
function run(){}
}
namespace shop;
class User{
function run(){}
}
class CAUser{
function run(){}
}
use com\admin\User; //直接导入一个类
$comAdmin = new User(); //与当前命名空间中User发生冲突,程序产生致命错误
use com\admin\User as CAUser; //为类使用别名
$comAdmin = new CAUser(); //与当前命名空间中CAUser发生冲突,程序产生致命错误
执行结果:
除了使用别名和导入之外,我们还可以通过namespace 关键字和__NAMESPACE__(注:两边都是两个下划线)魔法常量动态的访问元素.其中namespace关键字表示当前命名空间,而魔法常量__NAMESPACE__的值是当前命名空间的名称,__NAMESPACE__可以通过组合字符串的形式来动态调用,下面我们看看实际例子:
<?php
namespace com\admin;
const PATH = '/com/admin';
class User{
function run(){
echo "这是命名空间com\admin下的User类的方法<br>";
}
}
echo namespace\PATH . '<br>'; //namespace表示当前空间 <br>是换行符,为了打印结果可读性更好
$comAdmin = new namespace\User(); //使用namespace代替\com\admin调用类
$comAdmin->run();
echo __NAMESPACE__ . '<br>';
$comAdmin_ClassName = __NAMESPACE__ . '\User';
$caUser = new $comAdmin_ClassName();
$caUser->run();
执行结果如下:
总结
在上面动态调用的例子中,字符串形式的动态调用方式,需要注意的是使用双引号的时候,特殊字符可能被转义,比如:在__NAMESPACE__."\User"的时候,"\U"在双引号字符串中会被转义.此外,PHP在编译脚本的时候就确定了元素所在的空间,以及导入的情况.而在解析脚本的字符串形式的调用只能认为是非限定名称和完全限定名称,而永远不可能使限定名称.
标签:__,web,别名,空间,导入,命名,PHP From: https://blog.51cto.com/micai01/6525887