PHP使用语句命名空间

时间:2014-09-04 19:46:45

标签: php php-internals

也许这是一个奇怪的问题,但是当你写作时我无法理解php内部发生的事情:

use garcha\path\class;

我不是在询问命名空间的用途,而是关于那个语句本身,即使它没有分配任何内存,我的意思是,当你甚至为某个类提供别名时:

use garcha\path\class as withNewName;

它存储在哪里?或者它如何记住这些名字?它只在编译时发生吗?而不是运行时间?就像描述函数一样。

1 个答案:

答案 0 :(得分:2)

它不是一个非常复杂的算法(对于5.5,在5.6中描述的类名称部分是相同的)。

  1. 如果有必要,创建HashTable实例。它保持导入(使用的命名空间类)。
  2. 如果使用as关键字,则此名称将用作别名。否则使用导入类名的最后一个组件(对于XXX \ YYY \ ZZZ,名称为ZZZ)。将其转换为小写。
  3. 检查self / parent,它不能用作别名的名称。
  4. 检查class_table中是否已存在此名称(如果已声明,则使用当前命名空间)。
  5. 将此别名添加到特殊的HashTable(在第1页中提到)。
  6. 这张桌子在哪里使用?

    正在编译以解析类名。

    关于别名还有一个有趣的事情 - 它具有作为命名空间块的范围:

    <?php
    
    namespace nsC
    {
        class classC {}
    }
    
    namespace nsA
    {
        use nsC\classC as importC;
        new importC();
    }
    
    namespace nsB
    {
        // ERROR!
        new importC(); // or \nsA\importC()
    }