命名空间 - 尝试 ¶
作者:KK
发表日期:2018.8.5
练习 ¶
创建xxx-A.php
、yyy-A.php
和test.php
和两个文件。
xxx-A.php 的代码如下:
<?php
namespace xxx;
class A{
public function test(){
return 'test xxx a';
}
}
yyy-A.php 的代码如下:
<?php
namespace yyy;
class A{
public function hello(){
return 'test yyy a';
}
}
而test.php代码如下:
<?php
include('xxx-A.php');
include('yyy-A.php');
$xxxa = new xxx\A();
$yyya = new yyy\A();
print_r([
'xxx-A' => $xxxa->test(),
'yyy-A' => $yyya->hello(),
]);
然后运行 test.php 会输出如下内容:
Array
(
[xxx-A] => test xxx a
[yyy-A] => test yyy a
)
解释:两个A类通过namespace
关键字声明了它们所在的命名空间(你可以理解成将 A 这个类分配到了指定目录下),被 include 后,实例化的时候声明命名空间与类名(xxx\A
和yyy\A
)最后得到了对应的实例。
然而这两个A类实际上不是同一个类,就相当于我们磁盘里有两个文件名相同,但它们所在的文件夹不一样。
多层空间 ¶
你可以将上面例子中xxx\A
类的命名空间改成namespace xxx\yyy\zzz
,然后new xxx\yyy\zzz\A()
试试,就这么简单,命名空间可以通过\
符号作为分隔符隔开多个的。
术语规范 ¶
像上面的例子,一般我们随便谈话时才会说A
类,因为在项目中很少有相同的类名,而且就算类名相同,经常用到的也只是其中一个,另一个往往不经常用到。
但是在许多PHP的框架或者第三方类库中,都会规范地描述为xxx\A
和yyy\A
这样的完整类名,是带上命名空间的,以明确强调具体是哪个类,以免读文档的用户搞不清楚是指哪个。