PHP使用语句命名空间

Geo*_*ili 5 php php-internals

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

use garcha\path\class;
Run Code Online (Sandbox Code Playgroud)

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

use garcha\path\class as withNewName;
Run Code Online (Sandbox Code Playgroud)

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

小智 3

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

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

这个表用在什么地方呢?

就在编译期间解析类名。

关于别名还有一件更有趣的事情 - 它的范围是名称空间块:

<?php

namespace nsC
{
    class classC {}
}

namespace nsA
{
    use nsC\classC as importC;
    new importC();
}

namespace nsB
{
    // ERROR!
    new importC(); // or \nsA\importC()
}
Run Code Online (Sandbox Code Playgroud)