也许这是个奇怪的问题,但我无法弄清楚当您编写时 php 内部会发生什么:
use garcha\path\class;
我不是在问命名空间的用途,而是在问该语句本身,即使它不分配任何内存,我的意思是,当您甚至为某个类提供别名时:
use garcha\path\class as withNewName;
它存储在哪里?或者它是如何记住名字的?它只发生在编译时吗?而不是运行时间?就像只是描述功能。
最佳答案
这不是一个非常复杂的算法(对于 5.5,在 5.6 中描述的类名部分是相同的)。
- 如果有必要,创建哈希表的实例。它保留导入(使用的命名空间类)。
- 在使用
as
关键字的情况下,此名称用作别名。否则使用导入类名称的最后一个组件(对于 XXX\YYY\ZZZ,名称将是 ZZZ)。将其转换为小写。 - 检查
self
/parent
,它不能用作别名。 - 检查此名称是否已存在于 class_table 中(如果已声明,则使用当前命名空间)。
- 将此别名添加到特殊的 HashTable(在 p.1 中提到)。
这张 table 用在什么地方?
就在解析类名的编译过程中。
关于别名还有一件更有趣的事情——它的作用域是命名空间 block :
<?php
namespace nsC
{
class classC {}
}
namespace nsA
{
use nsC\classC as importC;
new importC();
}
namespace nsB
{
// ERROR!
new importC(); // or \nsA\importC()
}
关于命名空间的 PHP use 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25673824/