
为了更好的说明问题,假设主文件为 index.php,被引入的文件为 a.php。以两个文件为例来说明,使用 namespace 与 不使用 namespace 的区别。
大致分为四种情况:
- case1 : index.php(根命名空间) + a.php(根命名空间)
- case2 : index.php(根命名空间) + a.php(普通命名空间)
- case3 : index.php(普通命名空间) + a.php(根命名空间)
- case4 : index.php(普通命名空间) + a.php(普通命名空间)
根命名空间和普通命名空间做何解释?
任何 PHP 文件中函数、类、常量等定义都是放在命名空间之中的,当使用这些定义的时候会去命名空间中寻找。命名空间细分为根命名空间和普通命名空间。如果在 PHP 文件中没有使用 namespace ,则当前文件中的函数、类、常量等定义默认存储在根命名空间中,如果有使用 namespace X,则存储在普通命名空间 X 中。
CASE1 : 根命名空间 + 根命名空间

index.php 文件中代码可区分为两类:定义部分,逻辑部分。
定义部分会根据情况放置到不同的命名空间中,CASE1 情况下,index.php 文件本身定义的以及从 a.php 中加载的都会存储在大盒子(根命名空间),逻辑部分在调用时会从大盒子中寻找。
CASE2 : 根命名空间 + 普通命名空间

CASE2 情况下,因为 a.php 定义了 namespace a,所以对于 index.php 文件来说,其对应的命名空间既有大盒子(根命名空间),也有小盒子(普通命名空间a),如图,大盒子和小盒子彼此隔离,意味着大盒子里可以有 test(),小盒子里也可以有 test(),两者并不会相互冲突,调用的时候有一些关键点要注意。这部分在文章结尾会做说明。
CASE3 : 普通命名空间 + 根命名空间

CASE3 看起来只是将 CASE2 的顺序变更了一下,连图好像都没有什么区别。实质上的区别在于调用。工程的关键在于细节,这部分在文章结尾会做说明。
CASE4 : 普通命名空间 + 普通命名空间

CASE4 和前面 CASE 的不同在于,index.php 和 a.php 都定义了 namespace ,应该是没有根命名空间的,这里画出来是为了强调,根命名空间必然存在,只不过在当前情形下,根命名空间没有存储任何定义而已。
为了更好的理解上诉表达,针对不同 CASE 的情况,我构建了一些简单的测试代码,并在代码文件当中附带了说明,主要是前文所说的如何正确调用。可以去我的github下载不同 CASE 的测试文件。
更多文章,可查看个人博客。