命名空间 - 尝试

  • 作者:KK

  • 发表日期:2018.8.5


练习

创建xxx-A.phpyyy-A.phptest.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\Ayyy\A)最后得到了对应的实例。

然而这两个A类实际上不是同一个类,就相当于我们磁盘里有两个文件名相同,但它们所在的文件夹不一样。


多层空间

你可以将上面例子中xxx\A类的命名空间改成namespace xxx\yyy\zzz,然后new xxx\yyy\zzz\A()试试,就这么简单,命名空间可以通过\符号作为分隔符隔开多个的。


术语规范

像上面的例子,一般我们随便谈话时才会说A类,因为在项目中很少有相同的类名,而且就算类名相同,经常用到的也只是其中一个,另一个往往不经常用到。

但是在许多PHP的框架或者第三方类库中,都会规范地描述为xxx\Ayyy\A这样的完整类名,是带上命名空间的,以明确强调具体是哪个类,以免读文档的用户搞不清楚是指哪个。